pandas如何删除有序数据框中的行,直到出现特定值?

时间:2018-04-04 20:14:08

标签: python pandas

如何在每个列A的Python / pandas中删除行,直到第一个C值出现在B列中?

输入

index   | A   | B   |
--------|-----|-----|
0       | X   | A   |  
1       | X   | B   |
2       | X   | C   |  
3       | X   | A   |
4       | X   | C   |
5       | X   | ... |  
6       | Y   | A   |  
7       | Y   | B   |
8       | Y   | C   |  
9       | Y   | A   |
10      | Y   | C   |
11      | Y   | ... |  

期望的输出

index   | A   | B   |
--------|-----|-----|
2       | X   | C   |  
3       | X   | A   |
4       | X   | C   |
5       | X   | ... |  
8       | Y   | C   |  
9       | Y   | A   |
10      | Y   | C   |
11      | Y   | ... |  

1 个答案:

答案 0 :(得分:3)

假设您在Y群集之后没有第二个X群集(或者您认为所有X群集都相同,即使它们是不连续的):

一种方法是将B列与C(得到布尔系列False和True)进行比较,然后按A列进行分组。这些累积最大值将类似于False,False,True,True,True,我们在第一次看到C时开始获取Trues,我们可以使用它来索引到df。例如:

In [19]: df.loc[(df["B"] == "C").groupby(df["A"]).cummax()]
Out[19]: 
    A    B
2   X    C
3   X    A
4   X    C
5   X  ...
8   Y    C
9   Y    A
10  Y    C
11  Y  ...

,因为

In [20]: df["B"] == "C"
Out[20]: 
0     False
1     False
2      True
3     False
4      True
5     False
6     False
7     False
8      True
9     False
10     True
11    False
Name: B, dtype: bool

In [21]: (df["B"] == "C").groupby(df["A"]).cummax()
Out[21]: 
0     False
1     False
2      True
3      True
4      True
5      True
6     False
7     False
8      True
9      True
10     True
11     True
Name: B, dtype: bool