[英]Fill column based on conditional max value in Pandas
我有一个 dataframe,看起来像这样(链接到 csv ):
id, time, value, approved
0, 0:00, 10, false
1, 0:01, 20, false
1, 0:02, 50, false
1, 0:03, 20, true
1, 0:04, 40, true
1, 0:05, 40, true
1, 0:06, 20, false
2, 0:07, 35, false
2, 0:08, 35, false
2, 0:09, 50, true
2, 0:10, 50, true
我想计算一个列,该列对于每个 ID 的第一个最大批准值应该是正确的。 所以它应该是这样的:
id, time, value, approved, is_max
0, 0:00, 10, false, false
1, 0:01, 20, false, false
1, 0:02, 50, false, false
1, 0:03, 20, true, false
1, 0:04, 40, true, true
1, 0:05, 40, true, false
1, 0:06, 20, false, false
2, 0:07, 35, false, false
2, 0:08, 35, false, false
2, 0:09, 50, true, true
2, 0:10, 50, true, false
我可以用
df['is_max'] = df['value'] == df.groupby(['id', df['approved']])['value'].transform('max').where(df['approved'])
但这会将每个 ID 具有最大值的两行都设置为真(ID 1 为 0:04 和 0:05 | ID 2 为 0:09 和 0:10)。 我只想将具有最大值的第一行设置为 true。
这是根据您的解决方案使用pandas.DataFrame.mask
的方法:
approved_1st_max = df.mask(~df["approved"]).groupby("id")["value"].transform('idxmax')
df["is_max"]= df.reset_index()["index"].eq(approved_1st_max)
print(df)
id time value approved is_max
0 0 0:00 10 False False
1 1 0:01 20 False False
2 1 0:02 50 False False
3 1 0:03 20 True False
4 1 0:04 40 True True
5 1 0:05 40 True False
6 1 0:06 20 False False
7 2 0:07 35 False False
8 2 0:08 35 False False
9 2 0:09 50 True True
10 2 0:10 50 True False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.