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

问题描述 投票:2回答:2

我有一个如下的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)对的最新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。

python pandas
2个回答
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

3
投票

IIUC,你可以使用groupby.transformmax

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

[OUT]

  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

Edit

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

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

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

[OUT]

  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
© www.soinside.com 2019 - 2024. All rights reserved.