我有一个如下的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。
在这里你去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
IIUC,你可以使用groupby.transform
与max
:
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
如果您想获取最新日期的索引并找到相关的费用,您可以改为使用:
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