繁体   English   中英

根据 Pandas 中的条件最大值填充列

[英]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)

#Output:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM