Изменить : (используя **kwarg
с методом цепочки)
Как и в вашем комментарии, если вы хотите привязать метод к промежуточному (текущему) вычисленный) фрейм данных, вам необходимо определить собственный словарь для расчета каждого столбца, который будет использоваться с assign
следующим образом (вы не можете использовать лямбда для прямого построения словаря внутри assign
).
В этом примере я сделайте add
5 в фрейм данных перед объединением assign
, чтобы показать, как это работает при обработке цепочки, как вы хотите
d = {cl: lambda x, cl=cl: x[cl] - x['col1'] for cl in ['col2','col3']}
df_final = df.add(5).assign(**d)
In [63]: df
Out[63]:
col1 col2 col3
0 1 2 5
1 2 5 5
2 3 6 5
3 4 8 9
In [64]: df_final
Out[64]:
col1 col2 col3
0 6 1 4
1 7 3 3
2 8 3 2
3 9 4 5
Примечание : df_final.col1
отличается от df.col1
из-за операции add
до assign
. Не забудьте cl=cl
в лямбде словаря. Это необходимо, чтобы избежать проблемы с поздним связыванием python.
Используйте df.sub
df_sub = df.assign(**df[['col2','col3']].sub(df.col1, axis=0).add_prefix('sub_'))
Out[22]:
col1 col2 col3 sub_col2 sub_col3
0 1 2 5 1 4
1 2 5 5 3 3
2 3 6 5 3 2
3 4 8 9 4 5
Если вы хотите присвоить значения col2
, col3
, используйте дополнительные update
df.update(df[['col2','col3']].sub(df.col1, axis=0))
print(df)
Output:
col1 col2 col3
0 1 1 4
1 2 3 3
2 3 3 2
3 4 4 5