根据与Pandas groupby对象不同的列的最大值获取列的值

时间:2019-04-17 17:48:29

标签: python pandas

我有一个如下所示的df:

   name  pid  cost   Date
0    a    1   800  1991-01-31
1    b    2   200  1991-01-31
2    c    3   300  1991-01-31
3    a    1   400  2001-01-31
4    b    4   500  2001-01-31
5    c    3   600  2001-01-31

我想基于(name,pid)对的 latest maxCost向此df添加新列Date。因此,最终输出应如下所示:

   name  pid  cost   Date      maxCost
0    a    1   800  1991-01-31   400
1    b    2   200  1991-01-31   200
2    c    3   300  1991-01-31   600
3    a    1   400  2001-01-31   400
4    b    4   500  2001-01-31   500
5    c    3   600  2001-01-31   600

我使用创建了一个groupby对象

df.groupby(['name','pid']).Date.max().reset_index()

这给了我这样的数据框:

   name  pid    Date
0    a    1  2001-01-31
1    b    2  1991-01-31
2    b    4  2001-01-31
3    c    3  2001-01-31

这为我提供了(名称,pid)对的正确日期,但是如何从“费用”列中提取值?

任何帮助将不胜感激!

注意:我做了reset_index()只是为了使它在这篇文章中显示得更好。

更新maxCost应该查看最近日期的费用。将行索引:0的成本从100升级到800。

2 个答案:

答案 0 :(得分:3)

IIUC,您可以将groupby.transformmax一起使用:

df['maxCost'] = df.groupby(['name', 'pid'])['cost'].transform('max')

[出]

  name  pid  cost        Date  maxCost
0    a    1   100  1991-01-31      400
1    b    2   200  1991-01-31      200
2    c    3   300  1991-01-31      600
3    a    1   400  2001-01-31      400
4    b    4   500  2001-01-31      500
5    c    3   600  2001-01-31      600

编辑

如果您希望获取最新日期的索引并找到相关的费用,则可以使用:

df['Date'] = pd.to_datetime(df['Date'])

df['maxCost'] = (df.loc[df.groupby(['name', 'pid'])['Date']
                        .transform(lambda x: x.idxmax()), 'cost'].values)

[出]

  name  pid  cost       Date  maxCost
0    a    1   800 1991-01-31      400
1    b    2   200 1991-01-31      200
2    c    3   300 1991-01-31      600
3    a    1   400 2001-01-31      400
4    b    4   500 2001-01-31      500
5    c    3   600 2001-01-31      600

答案 1 :(得分:3)

您在sort_values transform之前first

df=df.sort_values(['Date','cost'])
df['maxCost']=df.groupby(['name','pid'])['cost'].transform('last')
df=df.sort_index()
df
Out[775]: 
  name  pid  cost       Date  maxCost
0    a    1   800 1991-01-31      400
1    b    2   200 1991-01-31      200
2    c    3   300 1991-01-31      600
3    a    1   400 2001-01-31      400
4    b    4   500 2001-01-31      500
5    c    3   600 2001-01-31      600