Pandas求多个数据框的总和

36

我有多个带有多级索引和值列的数据框。我想在值列上将所有数据框相加。

df1 + df2

由于并非每个数据框中的索引都是完整的,因此我会在某些行上得到nan,这些行不在所有数据框中都存在。

我该如何解决这个问题并将任何数据框中不存在的行视为具有0的值?

例如,我想得到

   val
a    2
b    4
c    3
d    3

使用 pd.DataFrame({'val':{'a': 1, 'b':2, 'c':3}}) + pd.DataFrame({'val':{'a': 1, 'b':2, 'd':3}}) 替代

   val
a    2
b    4
c  NaN
d  NaN
1个回答

51

使用add方法并加上fill_value=0参数。

df1 = pd.DataFrame({'val':{'a': 1, 'b':2, 'c':3}})
df2 = pd.DataFrame({'val':{'a': 1, 'b':2, 'd':3}})

df1.add(df2, fill_value=0)

   val
a  2.0
b  4.0
c  3.0
d  3.0

多级索引示例

idx1 = pd.MultiIndex.from_tuples([('a', 'A'), ('a', 'B'), ('b', 'A'), ('b', 'D')])
idx2 = pd.MultiIndex.from_tuples([('a', 'A'), ('a', 'C'), ('b', 'A'), ('b', 'C')])

np.random.seed([3,1415])
df1 = pd.DataFrame(np.random.randn(4, 1), idx1, ['val'])
df2 = pd.DataFrame(np.random.randn(4, 1), idx2, ['val'])

df1

          val
a A -2.129724
  B -1.268466
b A -1.970500
  D -2.259055

df2

          val
a A -0.349286
  C -0.026955
b A  0.316236
  C  0.348782

df1.add(df2, fill_value=0)

          val
a A -2.479011
  B -1.268466
  C -0.026955
b A -1.654264
  C  0.348782
  D -2.259055

超过2个数据框

from functools import reduce

df1 = pd.DataFrame({'val':{'a': 1, 'b':2, 'c':3}})
df2 = pd.DataFrame({'val':{'a': 1, 'b':2, 'd':3}})
df3 = pd.DataFrame({'val':{'e': 1, 'c':2, 'd':3}})
df4 = pd.DataFrame({'val':{'f': 1, 'a':2, 'd':3}})
df5 = pd.DataFrame({'val':{'g': 1, 'f':2, 'd':3}})

reduce(lambda a, b: a.add(b, fill_value=0), [df1, df2, df3, df4, df5])

    val
a   4.0
b   4.0
c   5.0
d  12.0
e   1.0
f   3.0
g   1.0

14
如果我有3个数据框,怎样以非常简单的方式使用 add 函数? - Zed Fang
我会给出不同于此的答案。我建议你提出另一个问题。这样每个人都能从中受益。 - piRSquared
@ZedFang 我会等着你的追问,并给出答案。 - piRSquared
1
@piRSquared 我认为如果您在这里写下您的答案,而不是添加两个关于如何回答另一个问题的评论,那将对每个人都有所帮助。 那么,您是否在其他地方回答了? - schnaidar
2
@schnaidar 好的,我更新了我的答案。 - piRSquared
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接