在
我有这个DataFrame:
pd.DataFrame(
{'name': ['Adam', 'Adam', 'Adam', 'Bill', 'Bill', 'Charlie', 'Charlie', 'Charlie', 'Charlie'],
'message': ['start', 'stuck', 'finish', 'start', 'stuck', 'start', 'stuck', 'finish', 'finish']}
)
,我想删除所有带有消息"卡住"从所有没有消息"finish":
的行中删除pd.DataFrame(
{'name': ['Adam', 'Adam', 'Bill', 'Bill', 'Charlie', 'Charlie', 'Charlie'],
'message': ['start', 'finish', 'start', 'stuck', 'start', 'finish', 'finish']}
)
所以比尔永远不会"写完",所以他的信息将一直"卡住"。
如果有学生完成了,按student
分组并使用any
,这里我们希望它恢复到数据框的原始形状,所以我们使用groupby.transform
:
>>> sf = df['message'].eq('finish').groupby(df['name']).transform('any')
>>> sf
0 True
1 True
2 True
3 False
4 False
5 True
6 True
7 True
8 True
Name: message, dtype: bool
从那里可以很容易地删除学生尚未完成的消息:
>>> df[~sf | df['message'].ne('stuck'))]
name message
0 Adam start
2 Adam finish
3 Bill start
4 Bill stuck
5 Charlie start
7 Charlie finish
8 Charlie finish
这将工作:
df[~((df.name.isin(df[df.message=="finish"]['name'])) & (df.message=='stuck'))]
输出: