仅对于某些行,两个大小不同的熊猫数据帧的列总和

时间:2018-10-18 06:30:09

标签: python pandas sum

我有两个看起来像的熊猫数据框:

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

我只想对 n 相同的行求和column1column2。所需的输出看起来像:

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

请注意:

  • 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
    

    因为默认情况下,总和是根据共同的行索引执行的,而不是我希望的 n

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

2 个答案:

答案 0 :(得分:3)

使用Series.add,但首先由set_indexn列中创建索引:

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

使用merge并左联接的另一种解决方案:

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

答案 1 :(得分:0)

我通过合并数据框并在熊猫上求和来解决它:

--- :cachedir: /opt/puppetlabs/puppet/cache/r10k :sources: puppet: basedir: /etc/puppetlabs/code/environments remote: https://github.com/Sanket-Shirode/puppet-control.git

df = pd.merge(df1, df2, how='outer', on='n')

df['sum'] = df['column1'] + df['column2']

结果如下:

df[['n', 'sum']].fillna(0)