2013-07-16 222 views
16

我有以下蟒大熊貓數據幀:蟒大熊貓GROUPBY()結果

df = pd.DataFrame({ 
    'A': [1,1,1,1,2,2,2,3,3,4,4,4], 
    'B': [5,5,6,7,5,6,6,7,7,6,7,7], 
    'C': [1,1,1,1,1,1,1,1,1,1,1,1] 
    }); 

df 
    A B C 
0 1 5 1 
1 1 5 1 
2 1 6 1 
3 1 7 1 
4 2 5 1 
5 2 6 1 
6 2 6 1 
7 3 7 1 
8 3 7 1 
9 4 6 1 
10 4 7 1 
11 4 7 1 

我想有另一列存儲的總和超過C值固定(兩者)A和B的值也就是說,這樣的:

A B C D 
0 1 5 1 2 
1 1 5 1 2 
2 1 6 1 1 
3 1 7 1 1 
4 2 5 1 1 
5 2 6 1 2 
6 2 6 1 2 
7 3 7 1 2 
8 3 7 1 2 
9 4 6 1 1 
10 4 7 1 2 
11 4 7 1 2 

我與大熊貓groupby嘗試和它種工作方式:

res = {} 
for a, group_by_A in df.groupby('A'): 
    group_by_B = group_by_A.groupby('B', as_index = False) 
    res[a] = group_by_B['C'].sum() 

,但我不知道如何從res以有序的方式''得到結果。對此有任何建議會很高興。謝謝。

回答

13

這裏有一種方法(儘管它覺得這應該與一個應用程序一起工作,我無法得到它)。

In [11]: g = df.groupby(['A', 'B']) 

In [12]: df1 = df.set_index(['A', 'B']) 

size GROUPBY功能是你想要的,我們必須把它匹配到「A」和「B」作爲索引:

In [13]: df1['D'] = g.size() # unfortunately this doesn't play nice with as_index=False 
# Same would work with g['C'].sum() 

In [14]: df1.reset_index() 
Out[14]: 
    A B C D 
0 1 5 1 2 
1 1 5 1 2 
2 1 6 1 1 
3 1 7 1 1 
4 2 5 1 1 
5 2 6 1 2 
6 2 6 1 2 
7 3 7 1 2 
8 3 7 1 2 
9 4 6 1 1 
10 4 7 1 2 
11 4 7 1 2 
+0

謝謝@Andy Hayden!使用'sum'的解決方案我認爲更通用。事實上,我在'C'中沒有'1'(當'size'完美的時候,正如你在解決方案中指出的那樣),而是一些浮點數,所以爲了使其正常工作,我需要使用' sum'。但無論如何,輝煌的,再次感謝你。 –

+4

我認爲你夢寐以求的單行是''df ['D'] = df.groupby(['A','B']).transform(np.size)''。在好時光和壞時代,「變換」就在那裏。 :-D –

6

你也可以用做一個襯合併如下:

df = df.merge(pd.DataFrame({'D':df.groupby(['A', 'B'])['C'].size()}), left_on=['A', 'B'], right_index=True) 
+0

易於閱讀和理解 – jiamo

5

你也可以用做變換應用於進行分組的一個班輪:

df['D'] = df.groupby(['A','B'])['C'].transform('sum')