在Pandas中总结两个具有相同索引的数据帧

mk_*_*sch 3 python addition dataframe pandas

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

df1.add(df2)
Run Code Online (Sandbox Code Playgroud)

对于3个数据帧:

df3.add(df2.add(df1))
Run Code Online (Sandbox Code Playgroud)

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

piR*_*red 10

选项1
使用sum

sum([df1, df2, df3, df4])
Run Code Online (Sandbox Code Playgroud)

选项2
使用reduce

from functools import reduce

reduce(pd.DataFrame.add, [df1, df2, df3, df4])
Run Code Online (Sandbox Code Playgroud)

选项3
使用pd.concatpd.DataFrame.sum使用level=1
仅当数据框索引有单个级别时才有效.我们必须让它更有趣才能让它发挥作用.我推荐其他选项.

pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
Run Code Online (Sandbox Code Playgroud)

建立

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

演示

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

        0        1
0  (4+0j)  (-4+0j)
1      4j      -4j
Run Code Online (Sandbox Code Playgroud)
from functools import reduce

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

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

        0        1
0  (4+0j)  (-4+0j)
1      4j      -4j
Run Code Online (Sandbox Code Playgroud)

定时

小数据

%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
Run Code Online (Sandbox Code Playgroud)

更大的数据

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
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,简单的`sum`只能在这里工作+1,如果dfs的数量不是很高,你可以做'df1 + df2 + df3 + df4`作为替代 (2认同)