【问题标题】:subtract one column from multiple columns in the same dataframe using method chaining使用方法链接从同一数据框中的多列中减去一列
【发布时间】:2020-10-10 01:52:27
【问题描述】:

我在 pandas 中有一个数据框,我想从 col2col3 中减去一列(比如说 col1)(如果有的话,从更多列中减去)而不为每个列编写下面的分配语句柱子。

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)
     )

我该怎么做?或者它会与应用一起工作吗?您如何使用方法链接来做到这一点?

【问题讨论】:

  • @anky:我在撰写和测试答案时没有看到您的评论 :)

标签: python pandas dataframe lambda apply


【解决方案1】:

编辑(使用**kwarg与链接方法)

在您的评论中,如果您想在中间(正在进行的计算)数据帧上链接方法,您需要定义一个自定义字典来计算与 assign 一起使用的每一列,如下所示(您不能使用lambda 直接在assign 内部构造字典)。

在此示例中,我在链接 assign 之前对数据框执行 add 5 以显示它如何根据需要进行链处理

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.col1df.col1 不同,因为addassign 之前的操作。不要忘记字典 lambda 中的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

如果要将值分配回col2col3,请使用附加的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

【讨论】:

  • 谢谢安迪,但如果我以前有写过的东西,我会怎么做。那么使用方法链呢?所以不要使用 df 使用 lambda x: ..x[['col2', 'col3']]
  • @corianne1234:你不能使用lambda直接在assign内部创建**kwarg。您需要使用 lambda 创建自定义字典。我编辑了答案以显示它。检查我编辑的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2020-09-28
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多