2016-12-15 59 views
1

熊貓是新手,所以想知道是否有更多的Pandithic(創造它!)方法來對一些數據進行排序,對它進行分組,然後對其中的一部分進行求和。問題是要找出一系列值中的3個最大值,然後僅求和它們。熊貓更好的方式進行排序,分組,總結

census_cp是一個數據框,包含有關州縣的信息。我目前的解決辦法是:

cen_sort = census_cp.groupby('STNAME').head(3) 
cen_sort = cen_sort.groupby('STNAME').sum().sort_values(by='CENSUS2010POP', ascending=False).head(n=3) 
cen_sort = cen_sort.reset_index() 
print(cen_sort['STNAME'].values.tolist()) 

林特別好奇,如果有更好的方法來做到這一點,以及爲什麼我不能把總和在前一行和鏈的末端一起什麼,在我看來是很明顯連接的項目(獲得每個項目的前3名並將它們加在一起)。

+0

現值進行排序第一,用'。頭(3)'需要每組頂'3'值? – jezrael

+0

技術術語當然是'熊貓人'。 – pvg

回答

1

我認爲你可以使用headsum先用groupby然後nlargest

df = census_cp.groupby('STNAME') 
       .apply(lambda x: x.head(3).sum(numeric_only=True)) 
       .reset_index() 
       .nlargest(3, 'CENSUS2010POP') 

樣品:

census_cp = pd.DataFrame({'STNAME':list('abscscbcdbcsscae'), 
        'CENSUS2010POP':[4,5,6,5,6,2,3,4,5,6,4,5,4,3,6,5]}) 

print (census_cp) 
    CENSUS2010POP STNAME 
0    4  a 
1    5  b 
2    6  s 
3    5  c 
4    6  s 
5    2  c 
6    3  b 
7    4  c 
8    5  d 
9    6  b 
10    4  c 
11    5  s 
12    4  s 
13    3  c 
14    6  a 
15    5  e 


df = census_cp.groupby('STNAME') \ 
       .apply(lambda x: x.head(3).sum(numeric_only=True)) \ 
       .reset_index() \ 
       .nlargest(3, 'CENSUS2010POP') 
print (df) 
    STNAME CENSUS2010POP 
5  s    17 
1  b    14 
2  c    11 

如果需要雙頂3nlargest每個組,然後nlargest彙總值使用:

df1 = census_cp.groupby('STNAME')['CENSUS2010POP'] 
       .apply(lambda x: x.nlargest(3).sum()) 
       .nlargest(3) 
       .reset_index() 
print (df1) 
    STNAME CENSUS2010POP 
0  s    17 
1  b    14 
2  c    13 

或者:

df1 = census_cp.groupby('STNAME')['CENSUS2010POP'].nlargest(3) 
       .groupby(level=0) 
       .sum() 
       .nlargest(3) 
       .reset_index() 
print (df1) 
    STNAME CENSUS2010POP 
0  s    17 
1  b    14 
2  c    13 
+0

愛最大的。對將不同的操作放在不同的線路上感到好奇。這是熊貓的首選語法,還是你只是爲了易讀而做的?每個命令結尾還需要'\'嗎? – DChaps

+0

不,\僅用於python代碼中的長行。如果忽略python有時會返回錯誤。但是可能只使用一行代碼,但它的可讀性較差。 – jezrael