仅对某些行的不同大小的两个 pandas 数据帧的列进行求和

Edo*_*IFP 4 python sum pandas

我有两个 pandas 数据框,如下所示:

df1:
      n  column1
0   5.0      0.0
1   6.0      0.0
2   7.0      0.0
3   8.0      0.0
4   9.0      0.0
5  10.0      0.0

df2:
     n  column2
0  6.0      1.0
1  7.0      1.0
2  8.0      1.0
Run Code Online (Sandbox Code Playgroud)

我只想对n相同的行进行column1求和。所需的输出如下所示:column2

df3:
      n  column1
0   5.0      0.0
1   6.0      1.0
2   7.0      1.0
3   8.0      1.0
4   9.0      0.0
5  10.0      0.0
Run Code Online (Sandbox Code Playgroud)

请注意:

  • n的值可能因情况而异,因此我无法用df2零填充 的列并执行经典求和。
  • n的值最终不应被修改。因此,我想避免诸如移动n值以使它们与行索引匹配之类的解决方法。
  • 到目前为止我所尝试的结果如下:

          n  column1
    0   5.0      1.0
    1   6.0      1.0
    2   7.0      1.0
    3   8.0      NaN
    4   9.0      NaN
    5  10.0      NaN
    
    Run Code Online (Sandbox Code Playgroud)

    因为 sum 默认情况下是基于行的公共索引而不是我希望的n执行的。

如何使用 pandas 内置函数执行此操作?

jez*_*ael 5

使用Series.add,但首先n通过以下方式从列创建索引set_index

df = (df2.set_index('n')['column2']
         .add(df1.set_index('n')['column1'], fill_value=0)
         .reset_index(name='column1'))
print (df)
      n  column1
0   5.0      0.0
1   6.0      1.0
2   7.0      1.0
3   8.0      1.0
4   9.0      0.0
5  10.0      0.0
Run Code Online (Sandbox Code Playgroud)

另一个带有merge和 left join 的解决方案:

df = (df1.merge(df2, on='n', how='left'))
df['column1'] = df['column2'].add(df['column1'], fill_value=0)
df = df.drop('column2', axis=1)
print (df)
      n  column1
0   5.0      0.0
1   6.0      1.0
2   7.0      1.0
3   8.0      1.0
4   9.0      0.0
5  10.0      0.0
Run Code Online (Sandbox Code Playgroud)