2016-09-29 86 views
10

我想分組列並計算另一列的數值。熊貓reset_index後groupby.value_counts()

import pandas as pd 
dftest = pd.DataFrame({'A':[1,1,1,1,1,1,1,1,1,2,2,2,2,2], 
       'Amt':[20,20,20,30,30,30,30,40, 40,10, 10, 40,40,40]}) 

print(dftest) 

dftest看起來像

A Amt 
0 1 20 
1 1 20 
2 1 20 
3 1 30 
4 1 30 
5 1 30 
6 1 30 
7 1 40 
8 1 40 
9 2 10 
10 2 10 
11 2 40 
12 2 40 
13 2 40 

執行分組

grouper = dftest.groupby('A') 
df_grouped = grouper['Amt'].value_counts() 

這給

A Amt 
1 30  4 
    20  3 
    40  2 
2 40  3 
    10  2 
Name: Amt, dtype: int64 

我要的是讓每個小組的前兩名行

而且,我被錯誤困擾,當我試圖reset_index

df_grouped.reset_index() 

這給下面的錯誤

df_grouped.reset_index() ValueError: cannot insert Amt, already exists

回答

15

您需要的參數namereset_index,因爲Series的名字是一樣的一個名稱的水平MultiIndex

df_grouped.reset_index(name='count') 

另一種解決方案是renameSeries名稱:

print (df_grouped.rename('count').reset_index()) 

    A Amt count 
0 1 30  4 
1 1 20  3 
2 1 40  2 
3 2 40  3 
4 2 10  2 

更常見的解決方案,而不是value_counts是總size

df_grouped1 = dftest.groupby(['A','Amt']).size().rename('count').reset_index() 

print (df_grouped1) 
    A Amt count 
0 1 20  3 
1 1 30  4 
2 1 40  2 
3 2 10  2 
4 2 40  3 
+0

完美!解決重置索引問題...有沒有一種更好的方法來保持排前n行,計數...現在嘗試了幾件事情後,只有可能的方式,我能想到的是第一個groupby.value_counts,然後子集 – muon

+0

也許需要['nlargest'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.nlargest.html) - ''dftest.groupby(['A','Amt']) .size()。nlargest(3)' – jezrael

+0

不是按組來做的,​​只給出整體最大的 – muon