У меня есть фрейм данных:
df_dict = {
'sum': np.nan,
'src1': [5, 1, 1, 5, 1],
'src2': [2, 6, 2, 4, 1]
}
df = pd.DataFrame(df_dict)
В настоящее время я обновляю столбец 'sum', выполняя:
def transform(x):
row_num = int(x.name)
previous_sum = 0
if row_num > 0:
previous_sum = df.at[row_num-1,'sum']
src1 = df.at[row_num,'src1']
src2 = df.at[row_num,'src2']
df.at[row_num,'sum'] = previous_sum - src2 + src1
df.apply( lambda x: transform(x), axis=1)
, что приводит к правильному выводу:
sum src1 src2
0 3.0 5 2
1 -2.0 1 6
2 -3.0 1 2
3 -2.0 5 4
4 -2.0 1 1
Проблема в большом кадре данных со многими строками, и повторять его во многих столбцах очень медленно.
Я хотел бы оптимизировать его, чтобы каким-то образом использовать некоторые встроенные панды / numpy векторизацию, если это возможноили любое более оптимизированное решение.
Мой пример лучшего решения
df['sum'] = df['sum'].shift() - df['src1'] + df['src2']
Что приводит к неверному выводу
sum src1 src2
0 NaN 5 2
1 NaN 1 6
2 NaN 1 2
3 NaN 5 4
4 NaN 1 1