Python 删除数据框中条件首次出现之前的所有行
我有以下数据框: 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对应者astypeboolPython 删除数据框中条件首次出现之前的所有行,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从未发生,则清除属于
我想将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