首页 > 解决方案 > 使用方法链接从同一数据框中的多列中减去一列

问题描述

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

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

我怎样才能做到这一点?或者它会与应用一起工作吗?你怎么能用方法链来做到这一点?

标签: pythonpandasdataframelambdaapply

解决方案


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

如您的评论所示,如果您想在中间(正在进行的计算)数据帧上链接方法,您需要定义一个自定义字典来计算要使用的每一列,assign如下所示(您不能使用 lambda 直接在里面构造字典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有所不同。不要忘记字典的 lambda。它可以避免 python 的后期绑定问题df.col1addassigncl=cl


采用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

推荐阅读