【问题标题】:Summing up more than two dataframes with the same indexes in Pandas在 Pandas 中总结两个以上具有相同索引的数据帧
【发布时间】:2017-07-07 15:00:28
【问题描述】:

我想在 Pandas 中添加 4 个具有相同索引的 Dataframe 的值。如果有两个数据帧,df1 和 df2,我们可以这样写:

df1.add(df2)

对于 3 个数据帧:

df3.add(df2.add(df1))

我想知道在 Python 中是否有更通用的方法。

【问题讨论】:

    标签: python pandas dataframe addition


    【解决方案1】:

    选项 1
    使用sum

    sum([df1, df2, df3, df4])
    

    选项 2
    使用reduce

    from functools import reduce
    
    reduce(pd.DataFrame.add, [df1, df2, df3, df4])
    

    选项 3
    pd.concatpd.DataFrame.sumlevel=1 一起使用
    这仅在数据帧索引只有一个级别时才有效。我们必须变得更可爱一点才能让它发挥作用。我推荐其他选项。

    pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
    

    设置

    df = pd.DataFrame([[1, -1], [complex(0, 1), complex(0, -1)]])
    df1, df2, df3, df4 = [df] * 4
    

    演示

    sum([df1, df2, df3, df4])
    
            0        1
    0  (4+0j)  (-4+0j)
    1      4j      -4j
    

    from functools import reduce
    
    reduce(pd.DataFrame.add, [df1, df2, df3, df4])
    
            0        1
    0  (4+0j)  (-4+0j)
    1      4j      -4j
    

    pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
    
            0        1
    0  (4+0j)  (-4+0j)
    1      4j      -4j
    

    时机

    小数据

    %timeit sum([df1, df2, df3, df4])
    %timeit reduce(pd.DataFrame.add, [df1, df2, df3, df4])
    %timeit pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
    
    1000 loops, best of 3: 591 µs per loop
    1000 loops, best of 3: 456 µs per loop
    100 loops, best of 3: 3.61 ms per loop
    

    更大的数据

    df = pd.DataFrame([[1, -1], [complex(0, 1), complex(0, -1)]])
    df = pd.concat([df] * 1000, ignore_index=True)
    df = pd.concat([df] * 100, axis=1, ignore_index=True)
    df1, df2, df3, df4 = [df] * 4
    
    %timeit sum([df1, df2, df3, df4])
    %timeit reduce(pd.DataFrame.add, [df1, df2, df3, df4])
    %timeit pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
    
    100 loops, best of 3: 3.94 ms per loop
    100 loops, best of 3: 2.9 ms per loop
    1 loop, best of 3: 1min per loop
    

    【讨论】:

    • 有趣的是,简单的 sum 只在这里工作 +1,如果 dfs 的数量不是令人望而却步,你可以使用 df1 + df2 + df3 + df4 作为替代
    • 它在底层对象上调用__add__ 方法......所以它只是工作
    • 很好的答案!选项2的注释:如果你只得到很多NaN值,你需要定义一个fill_value:reduce(lambda x, y: pd.DataFrame.add(x, y, fill_value=0), [df1, df2, df3 ])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2020-11-02
    • 2020-05-19
    • 2013-03-16
    • 2021-12-05
    相关资源
    最近更新 更多