对两个具有不同索引的数据帧求和

时间:2019-06-25 15:05:28

标签: python pandas

我有两个具有不同索引的数据框,我想对两个数据框的同一列求和。 根据一个建议,我尝试了以下操作,但忽略了其他列,例如cat

df = df.set_index('date')
tmp = tmp.set_index('date')
result = df['Anomaly'].add(tmp['Anomaly'], fill_value=0).reset_index()
df
    date       cat    Anomaly
0 2018-12-06    a      0
1 2019-01-07    b      0
2 2019-02-06    a      1
3 2019-03-06    a      0
4 2019-04-06    b      0

tmp
    date        cat   Anomaly
0 2018-12-06     a      0
1 2019-01-07     b      1
4 2019-04-06     b      0

result
    date           Anomaly
0 2018-12-06         0.0
1 2019-01-07         1.0 
2 2019-02-06         1.0
3 2019-03-06         0.0
4 2019-04-06         0.0

我真正想要的是基于索引求和,并保留类别列和int的{​​{1}} dtype:

Anomaly

3 个答案:

答案 0 :(得分:1)

尝试update

df.Anomaly.update(df.Anomaly+tmp.Anomaly)

输出:

           cat  Anomaly
date                   
2018-12-06   a        0
2019-01-07   b        1
2019-02-06   a        1
2019-03-06   a        0
2019-04-06   b        0

答案 1 :(得分:1)

concatgroupby

pd.concat([df, temp]).groupby(['date','cat'], as_index=False).sum()  

         date cat  Anomaly
0  2018-12-06   a        0
1  2019-01-07   b        1
2  2019-02-06   a        1
3  2019-03-06   a        0
4  2019-04-06   b        0

set_index + add

a = df.set_index(['date', 'cat'])
b = temp.set_index(['date', 'cat'])

a.add(b, fill_value=0).reset_index().astype({'Anomaly': int})

         date cat  Anomaly
0  2018-12-06   a        0
1  2019-01-07   b        1
2  2019-02-06   a        1
3  2019-03-06   a        0
4  2019-04-06   b        0

答案 2 :(得分:1)

经过最小的调整后,我在上一个问题中给出的answer仍然有效:

tmp1 = tmp.set_index('date')
result = df.set_index('date')
result.loc[tmp1.index, 'Anomaly'] += tmp1['Anomaly]
result.reset_index(inplace=True)

它给出:

         date cat  Anomaly
0  2018-12-06   a        0
1  2019-01-07   b        1
2  2019-02-06   a        1
3  2019-03-06   a        0
4  2019-04-06   b        0

保留df中的cat列,并将Anomaly的类型保持为int64。