python-3.x - 过滤并获取数据框中条件之间的行

标签 python-3.x pandas dataframe

我的 DataFrame 看起来像这样:


+----------------------------------+---------+
|               Col1               |  Col2   |
+----------------------------------+---------+
| Start A                          |    1    |
| value 1                          |    2    |
| value 2                          |    3    |
| value 3                          |    4    |
| value 5                          |    5    |
| End A                            |    6    |
| value 6                          |    3    |
| value 7                          |    4    |
| value 8                          |    5    |
| Start B                          |    1    |
| value 1                          |    2    |
| value 2                          |    3    |
| value 3                          |    4    |
| value 5                          |    5    |
| End B                            |    6    |
| value 6                          |    3    |
| value 7                          |    4    |
| value 8                          |    5    |
| Start C                          |    1    |
| value 1                          |    2    |
| value 2                          |    3    |
| value 3                          |    4    |
| value 5                          |    5    |
| End C                            |    6    |
+----------------------------------+---------+

我想要实现的是,如果存在子字符串 start 和 end 我想要它们之间的行。 预期结果是:


+----------------------------------+---------+
|               Col1               |  Col2   |
+----------------------------------+---------+
| Start A                          |    1    |
| value 1                          |    2    |
| value 2                          |    3    |
| value 3                          |    4    |
| value 5                          |    5    |
| End A                            |    6    |
| Start B                          |    1    |
| value 1                          |    2    |
| value 2                          |    3    |
| value 3                          |    4    |
| value 5                          |    5    |
| End B                            |    6    |
| Start C                          |    1    |
| value 1                          |    2    |
| value 2                          |    3    |
| value 3                          |    4    |
| value 5                          |    5    |
| End C                            |    6    |
+----------------------------------+---------+

我尝试了 How to filter dataframe columns between two rows that contain specific string in column? 中的代码

m = df['To'].isin(['Start A', 'End A']).cumsum().eq(1)
df[m|m.shift()]

但这只返回第一组开始和结束,它也需要确切的字符串。

输出:

+----------------------------------+---------+
|               Col1               |  Col2   |
+----------------------------------+---------+
| Start A                          |    1    |
| value 1                          |    2    |
| value 2                          |    3    |
| value 3                          |    4    |
| value 5                          |    5    |
| End A                            |    6    |
+----------------------------------+---------+

最佳答案

您链接到的答案旨在使用一对开始/结束

一个更通用的变体是检查组的奇偶性(假设严格交替开始/结束):

m1 = df['Col1'].str.match(r'Start|End').cumsum().mod(2).eq(1)

# boolean indexing
out = df[m1|m1.shift()]

或者,使用每个 Start 作为标志来保留以下行,并使用每个 End 作为标志来删除它们。然而,这不会像@Quang 的好答案那样考虑 Start/End 之后的 A/B/C 字母:

# extract Start/End
s = df['Col1'].str.extract(r'^(Start|End)', expand=False)

# set flags and ffill
m1 = s.replace({'Start': True, 'End': False}).ffill()

# boolean slicing
out = df[m1|m1.shift()]

输出:

       Col1  Col2
0   Start A     1
1   value 1     2
2   value 2     3
3   value 3     4
4   value 5     5
5     End A     6
9   Start B     1
10  value 1     2
11  value 2     3
12  value 3     4
13  value 5     5
14    End B     6
18  Start C     1
19  value 1     2
20  value 2     3
21  value 3     4
22  value 5     5
23    End C     6

关于python-3.x - 过滤并获取数据框中条件之间的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73768289/

相关文章:

python - 我无法删除整个列 - Pandas

python - 决策树中特定类的 Sklearn 决策规则

python - 使用一个类同时作为装饰器和装饰器工厂进行操作

python - 如何删除具有 1000 列的大型 df 中的错误值

python - Numpy 将整数转为小数

r - 获取两列的最小值

python - 如何找到具有时间戳索引的 DataFrame 中的前一行?

python-3.x - FastAPI + Tortoise ORM 出现 KeyError : '__module__' on pydantic_model_creator

python - 在 Python 的控制台上将字符打印到某个点?

python - 根据条件 python pandas 向数据帧添加新行