2017-08-31 277 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