2017-07-07 54 views

回答

8

选项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 
+2

有趣的是,普通的'sum'在这里工作+1,如果dfs的数量不是过高,你可以做'df1 + df2 + df3 + df4'作为替代 – EdChum

+1

它调用'__add__'方法底层的对象......所以它只是起作用 – piRSquared

相关问题