Pandas groupby nighgest sum

时间:2016-11-02 22:07:03

标签: python pandas group-by sum

我正在尝试在Pandas中同时使用groupbynlargestsum函数,但无法使其正常工作。

State    County    Population
Alabama  a         100
Alabama  b         50
Alabama  c         40
Alabama  d         5
Alabama  e         1
...
Wyoming  a.51      180
Wyoming  b.51      150
Wyoming  c.51      56
Wyoming  d.51      5

我想使用groupby按州选择,然后按人口获得前2个县。然后只使用前2个县人口数来获得该州的总和。

最后,我将有一个列表,其中包含州和人口(前2个县)。

我可以让groupbynlargest工作,但获得nlargest(2)的总和是一个挑战。

我现在所拥有的只是:df.groupby('State')['Population'].nlargest(2)

2 个答案:

答案 0 :(得分:21)

执行apply后,您可以使用groupby

df.groupby('State')['Population'].apply(lambda grp: grp.nlargest(2).sum())

我认为您遇到的问题是df.groupby('State')['Population'].nlargest(2)会返回一个DataFrame,因此您无法再进行组级操作。通常,如果您想在群组中执行多项操作,则需要使用apply / agg

结果输出:

State
Alabama    150
Wyoming    330

修改

一种稍微清洁的方法,正如@cᴏʟᴅsᴘᴇᴇᴅ所建议的那样:

df.groupby('State')['Population'].nlargest(2).sum(level=0)

这比在较大的DataFrame上使用apply略慢。

使用以下设置:

import numpy as np
import pandas as pd
from string import ascii_letters

n = 10**6
df = pd.DataFrame({'A': np.random.choice(list(ascii_letters), size=n),
                   'B': np.random.randint(10**7, size=n)})

我得到以下时间:

In [3]: %timeit df.groupby('A')['B'].apply(lambda grp: grp.nlargest(2).sum())
103 ms ± 1.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [4]: %timeit df.groupby('A')['B'].nlargest(2).sum(level=0)
147 ms ± 3.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

level kwarg sum kwarg在groupby内执行第二个list = [1,2,3,4] newList = [ i * 2 for i in list ]  ,可能会导致性能降低。

答案 1 :(得分:2)

使用agg,分组逻辑如下:

df.groupby('State').agg({'Population': {lambda x: x.nlargest(2).sum() }})

这导致另一个数据帧对象;您可以查询以查找人口最多的州等。

           Population
State
Alabama    150
Wyoming    330