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

2024-09-30 04:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)对的最新Date向这个df添加一个新列maxCost。所以,最终的输出应该是这样的:

   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

这为(name,pid)对提供了正确的日期,但是如何从cost列中提取值呢

任何帮助都将不胜感激

注意:我做了reset_index(),只是为了让它在这篇文章中更好地显示

更新maxCost应该查看最新日期的成本。更新行上的成本index:0 from 100到800


Tags: 数据对象namedfdateindexpidmax
2条回答

IIUC,您可以将^{}max一起使用:

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

sort_values之前transformfirst

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

相关问题 更多 >

    热门问题