Python 删除数据框中条件首次出现之前的所有行

Python 删除数据框中条件首次出现之前的所有行,python,pandas,Python,Pandas,我有以下数据框: df=pd.DataFrame{Person:[1,1,2,2,3,3,3,3],Bank:[B1,B2,B9,B2,B6,B1,B1,B5,]} 个人银行 01 B1 1 1 B2 2 B9 3 2 B2 4 3 B6 5 3 B1 6 3 B1 7.3 B5 我想在B1第一次出现之前删除每个人的所有行。也就是说,我想保留Bank==B1的行和下面的行 这就是我想要的: 个人银行 01 B1 1 1 B2 5 3 B1 6 3 B1 7.3 B5 如果B1从未发生,则清除属于

我有以下数据框:

df=pd.DataFrame{Person:[1,1,2,2,3,3,3,3],Bank:[B1,B2,B9,B2,B6,B1,B1,B5,]} 个人银行 01 B1 1 1 B2 2 B9 3 2 B2 4 3 B6 5 3 B1 6 3 B1 7.3 B5 我想在B1第一次出现之前删除每个人的所有行。也就是说,我想保留Bank==B1的行和下面的行

这就是我想要的:

个人银行 01 B1 1 1 B2 5 3 B1 6 3 B1 7.3 B5 如果B1从未发生,则清除属于此人的所有行。如果在B1第一次出现之前有行,我想删除它们。

您可以使用transform进行检查

使用mask+ffill

这是通过将组中第一次出现后的所有内容设置为非空值来实现的。这分两个步骤完成:

1屏蔽所有无效的内容

每组2人。这才是答案的真正关键。这意味着B1中第一次出现之后的所有值将由每个组的有效字符串填充,因此notnull不会删除这些值

一旦我们有了有效的掩码,就可以在掩码不为null的情况下过滤数据帧。

使用cumsum和它们的bool对应者astypebool


我想将B6排除在第三人之外,并将B5保留在第三人之外。@ArturoSbr在您的问题中,您打印的数据框和代码数据框不匹配。后者少了一行,你能解释一下为什么这样做吗?我可以看到df.Bank.wheredf.Bank==B1返回与条件匹配的行中的人员ID。按人和菲尔分组做什么?@ArturoSbr我更新了我的答案,显示了中间结果Wesome。谢谢ffill代表向前填充吗?是的,它代表向前填充。
s=(df['Bank']=='B1').groupby(df['Person'])

df[(df.index>=(s.transform('idxmax')))&s.transform('any')]
Out[305]: 
   Person Bank
0       1   B1
1       1   B2
5       3   B1
6       3   B1
7       3   B5
m = df['Bank'].where(df['Bank'] == 'B1').groupby(df['Person']).ffill()

df[m.notnull()]
   Person Bank
0       1   B1
1       1   B2
5       3   B1
6       3   B1
7       3   B5
df['Bank'].where(df['Bank'] == 'B1')
0     B1
1    NaN
2    NaN
3    NaN
4    NaN
5     B1
6     B1
7    NaN
Name: Bank, dtype: object
>>> m
0     B1
1     B1
2    NaN
3    NaN
4    NaN
5     B1
6     B1
7     B1
Name: Bank, dtype: object
df[df.groupby('Person').Bank.transform(lambda s: s.eq('B1').cumsum().astype(bool))]
   Person Bank
0       1   B1
1       1   B2
5       3   B1
6       3   B1
7       3   B5