如何在每个列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 | ... |
答案 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