首页 > 解决方案 > 多次拆分字符串并将结果作为新的DataFrame返回

问题描述

我正在尝试反复拆分熊猫列。我想无限期地找到两个字符串之间的字符串。例如,假设我有来自以下输入的 pandas 列:

import numpy as np
import pandas as pd

data=np.array([["'abc'ad32kn'def'dfannasfl[]12a'ghi'"],
              ["'jk'adf%#d1asn'lm'dfas923231sassda"],
              ["'nop'ad&@*-0'qrs'd2&*@^#!!sda'tuv'dasdj_23'w'823a&@'xyz'adfa"]])

df = pd.DataFrame({'Practice Column': data.ravel()})

print(df)

然后,我想通过打开和关闭引号来拆分这些字符串'...',然后取出里面的内容。所以,我的最终输出是:

在此处输入图像描述

有人可以帮我吗?谢谢。

标签: pythonregexstringpandasdataframe

解决方案


让我们extractall在这里使用:

df['Practice Column'].str.extractall(r"'(.*?)'").unstack(1)[0].fillna('')

match    0    1    2  3    4
0      abc  def  ghi        
1       jk   lm             
2      nop  qrs  tuv  w  xyz

该模式'(.*?)'查找单引号内的所有字符串实例。更多信息 -

'      # Match opening quote
(      # Open capture group
.*?    # Non-greedy match for anything
)      # End of capture group
'      # Match closing quote

要将其与 合并df,您可以使用join

v = df.join(df['Practice Column']
    .str.extractall(r"'(.*?)'").unstack(1)[0].fillna(''))

或者,将“练习栏”分配回去:

v = df['Practice Column'].str.extractall(r"'(.*?)'").unstack(1)[0].fillna('')
v.insert(0, 'Practice Column', df['Practice Column'])

print(v)

match                                    Practice Column    0    1    2  3    4
a                    'abc'ad32kn'def'dfannasfl[]12a'ghi'  abc  def  ghi        
b                     'jk'adf%#d1asn'lm'dfas923231sassda   jk   lm             
c      'nop'ad&@*-0'qrs'd2&*@^#!!sda'tuv'dasdj_23'w'8...  nop  qrs  tuv  w  xyz

另一种具有列表理解的解决方案(用于性能)。

import re

p = re.compile("'(.*?)'")    
pd.DataFrame([
    p.findall(s) for s in df['Practice Column']]).fillna('')

     0    1    2  3    4
0  abc  def  ghi        
1   jk   lm             
2  nop  qrs  tuv  w  xyz

如果有 NaN,这将不起作用,因此这里是上述解决方案的修改版本。您需要先删除 NaN。

pd.DataFrame([
    p.findall(s) for s in df['Practice Column'].dropna()]
).fillna('')

     0    1    2  3    4
0  abc  def  ghi        
1   jk   lm             
2  nop  qrs  tuv  w  xyz

推荐阅读