Pandas 在每个组的条件为真后保留行
Pandas keep rows after a condition is true for each group
我目前遇到以下问题,我希望在满足条件之前删除 pandas 数据框中的行。我想在“数字”列中满足 10 或更大条件之前删除每一行,具体取决于“名称”列。假设数据框 (df) 有两列,分别称为 'Name' 和 'Number'。我希望在满足条件之前删除每个唯一名称的所有行,并保留之后的所有行。
Name Number
Matt 4
Matt 5
Matt 13
Matt 4
Sophie 5
Sophie 14
Sophie 18
Steve 5
Steve 4
Steve 21
Desired output:
Name Number
Matt 13
Matt 4
Sophie 14
Sophie 18
Steve 21
下面的代码会在满足条件后删除所有项目,但这适用于整个系列/值列。我想为每个出现的唯一名称单独执行此操作。有什么办法可以做到这一点,也许用 groupby?
df[(df['Number'] > 10).argmax():]
非常感谢您的帮助!
注:
使用GroupBy.cummax
with condition for get greater values like 10
in Series.gt
and filter by boolean indexing
:
df = df[df['Number'].gt(10).groupby(df['Name']).cummax()]
print (df)
Name Number
2 Matt 13
3 Matt 4
5 Sophie 14
6 Sophie 18
9 Steve 21
详细信息:True
s 在第一场比赛后重复到组末尾:
print (df['Number'].gt(10).groupby(df['Name']).cummax())
1 False
2 True
3 True
4 False
5 True
6 True
7 False
8 False
9 True
Name: Number, dtype: bool
您可以使用 groupby
+ cummax
。 cummax
将 True 之后的每个 False 转换为 True,因此如果您 groupby
“名称”,它会创建一个布尔掩码,其中选择大于 10 的值之后的每个值:
msk = df['Number'].gt(10).groupby(df['Name']).cummax()
out = df[msk]
输出:
Name Number
2 Matt 13
3 Matt 4
5 Sophie 14
6 Sophie 18
9 Steve 21
我目前遇到以下问题,我希望在满足条件之前删除 pandas 数据框中的行。我想在“数字”列中满足 10 或更大条件之前删除每一行,具体取决于“名称”列。假设数据框 (df) 有两列,分别称为 'Name' 和 'Number'。我希望在满足条件之前删除每个唯一名称的所有行,并保留之后的所有行。
Name Number
Matt 4
Matt 5
Matt 13
Matt 4
Sophie 5
Sophie 14
Sophie 18
Steve 5
Steve 4
Steve 21
Desired output:
Name Number
Matt 13
Matt 4
Sophie 14
Sophie 18
Steve 21
下面的代码会在满足条件后删除所有项目,但这适用于整个系列/值列。我想为每个出现的唯一名称单独执行此操作。有什么办法可以做到这一点,也许用 groupby?
df[(df['Number'] > 10).argmax():]
非常感谢您的帮助!
注:
使用GroupBy.cummax
with condition for get greater values like 10
in Series.gt
and filter by boolean indexing
:
df = df[df['Number'].gt(10).groupby(df['Name']).cummax()]
print (df)
Name Number
2 Matt 13
3 Matt 4
5 Sophie 14
6 Sophie 18
9 Steve 21
详细信息:True
s 在第一场比赛后重复到组末尾:
print (df['Number'].gt(10).groupby(df['Name']).cummax())
1 False
2 True
3 True
4 False
5 True
6 True
7 False
8 False
9 True
Name: Number, dtype: bool
您可以使用 groupby
+ cummax
。 cummax
将 True 之后的每个 False 转换为 True,因此如果您 groupby
“名称”,它会创建一个布尔掩码,其中选择大于 10 的值之后的每个值:
msk = df['Number'].gt(10).groupby(df['Name']).cummax()
out = df[msk]
输出:
Name Number
2 Matt 13
3 Matt 4
5 Sophie 14
6 Sophie 18
9 Steve 21