2017-08-31 227 views
-1

有没有一种方法可以使用类似于pd.concat([df1, df2, df3, df4])的语法来求和多个大熊猫数据框。我从文档中明白我可以做df1.sum(df2, fill_value=0),但我有一长串DataFrames,我需要总结一下,并且想知道如果我可以在不写一个循环的情况下做到这一点。总结大熊猫数据框列表

有点相关提问/回答:Pandas sum multiple dataframes(堆栈溢出)的结果应该是什么样子

例子:

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')]) 
idx3 = pd.MultiIndex.from_tuples([('a', 'A'), ('a', 'D'), ('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']) 
df3 = pd.DataFrame(np.random.randn(4, 1), idx3, ['val']) 

DF1

enter image description here

DF2

enter image description here

DF3

enter image description here

结果应该是这样的:

enter image description here

+1

你只是寻找一个聚集DF与概括其中列和索引标签相匹配的每一个元素?或者你想要每个专栏的总和?请发布预期结果 – EdChum

+0

对于缺乏清晰度,我表示歉意。增加了截图,更清晰。 @EdChum – blahblahblah

+0

@ Jezrael的答案是做你想做的,我现在正在删除我的 – EdChum

回答

3

使用reduceadd与参数fill_value=0

np.random.seed(12) 

a = pd.DataFrame(np.random.randint(3, size=(5,3)), columns=list('abc')) 
b = pd.DataFrame(np.random.randint(3, size=(5,2)), columns=list('ab')) 
c = pd.DataFrame(np.random.randint(3, size=(5,2)), columns=list('ac')) 
print(a) 
    a b c 
0 2 1 1 
1 2 0 0 
2 2 1 0 
3 1 1 1 
4 2 2 2 

print(b) 
    a b 
0 0 1 
1 0 0 
2 1 2 
3 1 2 
4 0 1 

print(c) 
    a c 
0 2 0 
1 2 2 
2 2 0 
3 0 2 
4 1 1 

from functools import reduce 

dfs = [a,b, c] 
d = reduce(lambda x, y: x.add(y, fill_value=0), dfs) 
print (d) 
    a b c 
0 4 2.0 1.0 
1 4 0.0 2.0 
2 5 3.0 0.0 
3 2 3.0 3.0 
4 3 3.0 3.0 
+1

这就是OP在澄清之后要做的事情+1 – EdChum

+1

@EdChum - 谢谢。顺便说一下,你前段时间对我来说是个大老师,所以非常感谢你的答复;) – jezrael

+1

谢谢,我现在回答问题有点困难,没有那么多时间,但有趣问题仍然激起我的兴趣 – EdChum