如何在熊猫数据帧中按两列获取组的最大值,并在第三列上求和?



所以我在熊猫数据帧上使用了一个组,看起来像这样

df.groupby(['year','month'])['AMT'].agg('sum')

我得到这样的东西

year  month
2003  1            114.00
2           9195.00
3            300.00
5            200.00
6            450.00
7             68.00
8            750.00
9           3521.00
10           250.00
11           799.00
12          1000.00
2004  1           8551.00
2           9998.00
3          17334.00
4           2525.00
5          16014.00
6           9132.00
7          10623.00
8           7538.00
9           3650.00
10          7733.00
11         10128.00
12          4741.00
2005  1           6965.00
2           3208.00
3           8630.00
4           7776.00
5          11950.00
6          11717.00
7           1510.00
...    
2015  7        1431441.00
8         966974.00
9        1121650.00
10       1200104.00
11       1312191.90
12        482535.00
2016  1        1337343.00
2        1465068.00
3        1170113.00
4        1121691.00
5        1302936.00
6        1518047.00
7        1251844.00
8         825215.00
9        1491626.00
10       1243877.00
11       1632252.00
12        750995.50
2017  1         905974.00
2        1330182.00
3        1382628.52
4        1146789.00
5        1201425.00
6        1278701.00
7        1172596.00
8        1517116.50
9        1108609.00
10       1360841.00
11       1340386.00
12        860686.00

我想要的只是从第三个求和列中选择最大值,以便最终数据框只有每年的最大值,如下所示:

year  month
2003      2           9195.00
2004      3          17334.00
2005      5          11950.00

。等等

为此,我必须通过聚合向我的组添加什么?

我认为需要DataFrameGroupBy.idxmax

s = df.groupby(['year','month'])['AMT'].sum()
out = s.loc[s.groupby(level=0).idxmax()]
#working in newer pandas versions
#out = df.loc[df.groupby('Year').idxmax()]
print (out)
Year  month
2003  2         9195.0
2004  3        17334.0
2005  5        11950.0
Name: AMT, dtype: float64

如果可能,每年多个最大值:

out = s[s == s.groupby(level=0).transform('max')]
print (out)
Year  month
2003  2         9195.0
2004  3        17334.0
2005  5        11950.0
Name: AMT, dtype: float64

您可以将GroupBy+transformmax一起使用。请注意,这为存在平局的任何年份提供了多个最大值。这可能是您所需要的,也可能不是您需要的。

根据您的要求,可以分两步完成此操作,首先求和,然后按年计算最大值。

df = pd.DataFrame({'year': [2003, 2003, 2003, 2004, 2004, 2004],
'month': [1, 2, 2, 1, 1, 2],
'AMT': [100, 200, 100, 100, 300, 100]})
# STEP 1: sum by year + month
df2 = df.groupby(['year', 'month']).sum().reset_index()
# STEP 2: filter for max by year
res = df2[df2['AMT'] == df2.groupby(['year'])['AMT'].transform('max')]
print(res)
year  month  AMT
1  2003      2  300
2  2004      1  400

最新更新