2016-12-24 103 views
2

我試圖創建一個總列,基於第三列從另一列中總結數字。我可以通過使用.groupby()來做到這一點,但是這會創建一個截斷列,而我想要一個長度相同的列。熊貓 - 基於其他列創建總列

我的代碼:

df = pd.DataFrame({'a':[1,2,2,3,3,3], 'b':[1,2,3,4,5,6]}) 
df['total'] = df.groupby(['a']).sum().reset_index()['b'] 

我的結果:

a b total 
0 1 1 1.0 
1 2 2 5.0 
2 2 3 15.0 
3 3 4 NaN 
4 3 5 NaN 
5 3 6 NaN 

我期望的結果:

a b total 
0 1 1 1.0 
1 2 2 5.0 
2 2 3 5.0 
3 3 4 15.0 
4 3 5 15.0 
5 3 6 15.0 

...,其中每個'a'列具有相同的總的其他。

回答

5

從pandas中groupby操作返回的總和只會生成一個列,只要索引中唯一項的數量一樣。使用transform生成與原始數據幀相同長度的列(「類似索引」),而不執行任何合併。

df['total'] = df.groupby('a')['b'].transform(sum) 
>>> df 
    a b total 
0 1 1  1 
1 2 2  5 
2 2 3  5 
3 3 4  15 
4 3 5  15 
5 3 6  15 
+0

不完全確定爲什麼,但那就像一個魅力。謝謝! – pshep123

+0

很高興它適合你!文檔(在我的答案中只添加了一個鏈接)表示'transform'產生了一個與原始數據框「相似索引」的列。這意味着它與原始數據框的長度相同,不僅僅是索引中的唯一元素。 – 3novak