如何在熊猫数据帧中的两列上得出最大值,并在第三列上求和?

时间:2018-09-04 09:18:51

标签: python pandas dataframe pandas-groupby

所以我在一个像这样的熊猫数据框上使用了一个分组依据

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

...等等

我必须通过汇总添加到我的组中什么?

2 个答案:

答案 0 :(得分:1)

我认为需要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

答案 1 :(得分:1)

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

根据您的要求,可以分两个步骤进行操作,首先求和,然后按年份计算最大值。

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