вычесть один столбец из нескольких столбцов в одном кадре данных, используя цепочку методов - PullRequest
2 голосов
/ 19 июня 2020

У меня есть фрейм данных в pandas, и я хотел бы вычесть один столбец (скажем, col1) из col2 и col3 (или из большего количества столбцов, если они есть), не записывая приведенную ниже инструкцию assign для каждого столбца.

df = pd.DataFrame({'col1':[1,2,3,4], 'col2':[2,5,6,8], 'col3':[5,5,5,9]})

df = (df
     ...
     .assign(col2 = lambda x: x.col2 - x.col1)
     )

Как я могу это сделать? Или это сработает с применением? Как бы вы смогли сделать это с помощью цепочки методов?

1 Ответ

3 голосов
/ 19 июня 2020

Изменить : (используя **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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...