我有一个如下所示的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。
答案 0 :(得分:3)
IIUC,您可以将groupby.transform
与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
答案 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