2016-12-15 57 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