Pandas的新手如此疑惑是否有更多的Pandithic(创造它!)方式对某些数据进行排序,对其进行分组,然后对其中的一部分进行加总。问题是在一系列值中找到3个最大值,然后只对它们求和。
census_cp是一个包含有关州的信息的数据框。我目前的解决方案是:
dom
我特别好奇,如果有更好的方法来做到这一点以及为什么我不能将总和放在前一行的末尾并链接在一起似乎是我明显连接的项目(获得每个的前三个)并将它们加在一起)。
答案 0 :(得分:1)
我认为您可以先使用head
sum
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
如果每个群组需要双顶3
nlargest
,然后使用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