我的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    |
+----------------------------------+---------+

推荐答案

您链接到的答案设计为工作with a single pair of Start/End.

它的一个更一般的变体是判断组的奇偶性(假设严格交替的开始/结束):

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

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

或者,使用每个开始作为标志来保留下面的行,并使用每个结束作为标志来丢弃它们.然而,这不会像@Quang那样在开始/结束后考虑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相关问答推荐

IPython似乎已安装但无法运行

如何从Django连接到Neo4J s AuraDB(免费层)?'

只有在Chrome尚未打开的情况下,打开Chrome后,PySimpleGUI窗口才会崩溃

在 sum() 中将字符串转换为 int (或 float)

为什么 tkinter 在 tkinter 窗口外计算鼠标事件?

在不使用 split 函数的情况下从字符串中分割逗号(','),句号('.')和空格(' '),将字符串的单词附加到列表中

「Python Pandas」多级索引列和行匹配,如果列和行名称相似,则排除这些单元格中的值添加

Pandas groupby 然后 for each 组添加新行

使用 NaN 计算 pct_change 时如何避免 bfill 或 ffill

删除给定数组中所有元素为True的所有子数组

使用 selenium 加速网页抓取

Python 3 list(dictionary.keys()) 引发错误.我究竟做错了什么?

在不关心项目的情况下运行生成器功能的更简单方法

定义 True,如果没有定义,会导致语法错误

如何使用 python 库连接到 poloniex.com websocket api

为 Python 3 和 PyQt 构建可执行文件

Pruning in Keras

当 None 被传递时,如何将默认值应用于 python 数据类字段?

如何创建一个永远在其上运行滚动协程的事件循环?

在 Ipython 中使用 Pylint (Jupyter-Notebook)