Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按最大金额分组_Python_Pandas_Group By_Sum - Fatal编程技术网

Python 按最大金额分组

Python 按最大金额分组,python,pandas,group-by,sum,Python,Pandas,Group By,Sum,我试图在Pandas中同时使用groupby、nlargest和sum函数,但无法正常工作 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

我试图在Pandas中同时使用
groupby
nlargest
sum
函数,但无法正常工作

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名的县人口数来计算该州的总和

最后,我将有一个列表,其中包括该州和人口(前两个县)

我可以让
groupby
nlargest
工作,但是要得到
nlargest(2)
的总和是一个挑战


我现在的行很简单:
df.groupby('State')['Population'].nlargest(2)
在执行
groupby
之后,您可以使用
apply

df.groupby('State')['Population'].apply(lambda grp: grp.nlargest(2).sum())
我认为您遇到的问题是
df.groupby('State')['Population'].nlargest(2)
将返回一个数据帧,因此您不能再执行组级操作。通常,如果要在一个组中执行多个操作,则需要使用
apply
/
agg

结果输出:

State
Alabama    150
Wyoming    330
编辑

一个稍微干净的方法,正如@c所建议的ᴏʟᴅsᴘᴇᴇᴅ:

df.groupby('State')['Population'].nlargest(2).sum(level=0)
但这比在较大的数据帧上使用
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)

性能降低可能是由于
sum
中的
级别
kwarg在发动机罩下执行第二次
groupby

使用
agg
,分组逻辑如下所示:

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

这将导致另一个数据帧对象;你可以通过查询找到人口最多的州,等等

           Population
State
Alabama    150
Wyoming    330

它缺少一个卷曲的括号。您应该通过使用
df.groupby('State')['Population'].nlargest(2).sum(level=0)摆脱apply来修复此问题。
@cᴏʟᴅsᴘᴇᴇᴅ: 当数据帧大小很大时,您建议的
.nlargest(2).sum(level=0)
解决方案实际上比使用
apply
慢。
sum
中的
level
kwarg在引擎盖下执行第二个groupby操作,我猜这就是额外开销的来源。这很令人惊讶。因此,一个groupby+应用胜过两个groupby。学到了新东西,干杯!如果
不是唯一的,您的解决方案是否有效?假设有两行,如:
Alabama;E2
阿拉巴马州;E39
?是否考虑使用
e
而不是
c