gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:03:42 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com