基于正则表达式模式合并pandas数据框中的多行行

问题描述 投票:0回答:2

我有一个与此类似的单列数据框:

cat = { 'cat': ['a','b','c-','        -d','e']}
df = pd.DataFrame(cat)

>>> print(df)
          cat
0           a
1           b
2          c-
3          -d
4           e

我需要合并第 2 行和第 3 行:

          cat
0           a
1           b
2          cd
3          e

我正在尝试使用正则表达式,因为这些多行数据始终采用“- {8}-”。但是这不起作用:

df['cat'] = df['cat'].str.replace("-\n {8}-","",flags=re.M)

我无法使用任何分组技术,所以我有点卡住了。谢谢您的任何建议。

python pandas regex dataframe multiline
2个回答
0
投票

您可以通过识别以 groupby

 结尾或以 
- 开头的字符串来使用
 {8}-
 方法:

m1 = df['cat'].str.endswith('-')
m2 = df['cat'].str.match(' {8}-')
group = (~(m1.shift(fill_value=False) & m2)).cumsum().rename()

out = (df['cat'].groupby(group)
       .agg(lambda x: ''.join(x).replace('-        -', ''))
       .to_frame()
      )

输出:

  cat
1   a
2   b
3  cd
4   e

中间体:

          cat     m1     m2  group
0           a  False  False      1
1           b  False  False      2
2          c-   True  False      3
3          -d  False   True      3
4           e  False  False      4

0
投票

我会这样做:

  1. 连接移位一个/未移位的“cat”字符串
  2. 在新创建的值中搜索您的正则表达式模式
  3. 过滤/更新数据框
  4. 用空字符串替换多行值
tmp = df["cat"].shift() + df["cat"]
m = tmp.str.contains(r"-\s{8,}-").eq(True)

df = df[~m.shift(-1).eq(True)]
df.update(tmp[m])

df["cat"] = df["cat"].str.replace(r"-\s{8,}-", "", regex=True)

print(df)

打印:

  cat
0   a
1   b
3  cd
4   e
© www.soinside.com 2019 - 2024. All rights reserved.