2017-06-02 55 views
7

我正在使用熊貓和groupby進行彙總。我做了以下內容:在羣組中的每條記錄上顯示羣組

data = {'ac' : ['a','a','a','a','a','a','a','a','b','b','b','b','b'], 
     'cls' ['wwww','wwww','wwww','xxxx','xxxx','zzzz','zzzz','yyyy','wwww','xxxx','zzzz','zzzz','yyyy'], 
     'pl' : [1,1,1,1,1,1,1,1,1,1,1,1,1]} 

df = pd.DataFrame(data) 

grouped = df.groupby(['ac','cls']).agg({'pl':np.sum}) 


      pl 
    ac cls  
    a wwww 3 
     xxxx 2 
     yyyy 1 
     zzzz 2 
    b wwww 1 
     xxxx 1 
     yyyy 1 
     zzzz 2 

有沒有辦法做groupby它會在ac欄中填入,以便它讀起來就像下面?

   pl 
    ac cls  
    a wwww 3 
    a xxxx 2 
    a yyyy 1 
    a zzzz 2 
    b wwww 1 
    b xxxx 1 
    b yyyy 1 
    b zzzz 2 

回答

3

要重置索引:

import pandas as pd 

import numpy as np 

data = {'ac': ['a','a','a','a','a','a','a','a','b','b','b','b','b'], 
     'cls': ['wwww','wwww','wwww','xxxx','xxxx','zzzz','zzzz','yyyy','wwww','xxxx','zzzz','zzzz','yyyy'], 
     'pl': [1,1,1,1,1,1,1,1,1,1,1,1,1]} 

df = pd.DataFrame(data) 

grouped = df.groupby(['ac','cls']).agg({'pl':np.sum}) 
grouped.reset_index(inplace=True) 

print grouped 

此打印:

ac cls pl 
0 a wwww 3 
1 a xxxx 2 
2 a yyyy 1 
3 a zzzz 2 
4 b wwww 1 
5 b xxxx 1 
6 b yyyy 1 
7 b zzzz 2 
+0

謝謝,我不知道(雖然我應該有),該GROUPBY創建新的指數暫時做到這一點,而且一個簡單的reset_index可以解決它。我把這一個標記爲解決我的問題的答案,儘管兩者都是這樣做的,因爲它將操作嚴格保留在所討論的數據幀中,而不是作爲全局設置。 –

+0

你基本上可以得到相同的結果,但沒有額外的列使用'level'選項:'grouped.reset_index(level = 0)' – JohnE

2

你都清楚地顯示,在左側的項目是在指數位置指示列標題的右側。

這是用名爲display.multi_sparse的熊貓選項控制的。你可以用pd.set_option('display.multi_sparse', False)關閉它,或者你可以用pd.option_context

with pd.option_context('display.multi_sparse', False): 
    print(grouped) 

     pl 
ac cls  
a wwww 3 
a xxxx 2 
a yyyy 1 
a zzzz 2 
b wwww 1 
b xxxx 1 
b yyyy 1 
b zzzz 2 
+0

謝謝,我沒有意識到(儘管我應該),groupby創建了新的索引,而且一個簡單的reset_index可以解決它。我把這一個標記爲解決我的問題的答案,儘管兩者都是這樣做的,因爲它將操作嚴格保留在所討論的數據幀中,而不是作爲全局設置。 –

+0

@BinoyFernandez很明顯,asongtoruin得到了你真正需要的東西。但我想爲您的實際問題提供一個答案,以便其他人查找它可能會發現它是有益的。另外請注意,其他解決方案不會重現您陳述的結果。它不能離開索引中的列。 – piRSquared

0

使用as_index=True

In [748]: df.groupby(['ac', 'cls'], as_index=False).agg({'pl': np.sum}) 
Out[748]: 
    ac cls pl 
0 a wwww 3 
1 a xxxx 2 
2 a yyyy 1 
3 a zzzz 2 
4 b wwww 1 
5 b xxxx 1 
6 b yyyy 1 
7 b zzzz 2