【问题标题】:Pandas sum multiple dataframes熊猫对多个数据框求和
【发布时间】:2016-11-23 03:50:15
【问题描述】:

我有多个数据框,每个数据框都有一个多级索引和一个值列。我想将值列上的所有数据框相加。

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

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    使用带有fill_value=0参数的add方法。

    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
    

    【讨论】:

    • 非常简洁的答案!它也可以与多索引 DF 一起使用吗?
    • 如果我有3个dataframe,如何以非常简单的方式使用add
    • 我给出的答案会与此不同。我建议你再问一个问题。这样每个人都可以看到它的好处。
    • @piRSquared 我认为如果您只是在这里写下您的答案,而不是添加两个关于如果只有另一个问题时您将如何回答的问题,那么它会对每个人都有最大的帮助。那么,你有没有在某个地方回答过?
    • @schnaidar 很公平。我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 2018-07-22
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多