2013-08-01 53 views
18

我在groupby結果中使用.size()來計算每個組中有多少項。如何爲大小()列指定名稱?

我想將結果保存到一個新的列名稱,而無需手動編輯列名稱數組,如何完成?

感謝

這是我曾嘗試:

grpd = df.groupby(['A','B']) 
grpd['size'] = grpd.size() 
grpd 

,我得到了錯誤:

TypeError: 'DataFrameGroupBy' object does not support item assignment (on the second line)

+1

值得注意的是''size''對於一個列來說是個不錯的選擇,因爲它是熊貓每個對象的內建方法,所以你只能通過getitem而不是通過getattr來檢索它。 – Meitham

回答

12

df.groupby(...)結果是不是一個數據幀。要返回DataFrame,必須對每個組應用一個函數,轉換組中的每個元素或過濾組。

看起來好像你想要一個DataFrame包含(1)你所有的原始數據在df和(2)每個組中有多少數據的計數。這些東西具有不同的長度,所以如果他們需要進入同一個DataFrame,則需要冗餘列出大小,即每個組中的每一行。

df['size'] = df.groupby(['A','B']).transform(np.size) 

(旁白:這是有益的,如果你能證明簡潔樣品輸入和預期結果。)

+1

耶,改造! –

+0

我也發現這幾乎是平等的(創建一個新的數據框),但不知道它是如何與效率方面比較你的解決方案http://stackoverflow.com/questions/10373660/converting-a-pandas-groupby-object -to-dataframe – d1337

+0

更多關於你的解決方案在一個玩具的例子中效果很好,但在實際數據上返回錯誤http://pastebin.com/aCsMxCd5 – d1337

6

你需要transformsize - lendf是和以前一樣:

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df['size'] = df.groupby(['A', 'B'])['A'].transform('size') 
print (df) 
    A B size 
0 x a  1 
1 x c  2 
2 x c  2 
3 y b  2 
4 y b  2 

如果需要在彙總df - len中設置列名稱df明顯是不是相同a年代以前:

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df = df.groupby(['A', 'B']).size().reset_index(name='Size') 
print (df) 
    A B Size 
0 x a  1 
1 x c  2 
2 y b  2 
12

DataFrameGroupBy的.size()內置的方法其實對象返回與組大小,而不是一個數據幀的一系列對象。如果您想要一個DataFrame,其列是由組編制索引的組大小,並使用自定義名稱,則可以使用.to_frame()方法並使用所需的列名作爲其參數。

grpd = df.groupby(['A','B']).size().to_frame('size') 

如果你想這些小組是列再次,你可以在最後添加一個.reset_index()