多次拆分字符串并将结果作为新的DataFrame返回

时间:2018-12-19 04:46:18

标签: python regex string pandas 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)

然后,我想通过打开和关闭引号'...'来拆分这些字符串,然后取其中的内容。因此,我的最终输出将是:

enter image description here

有人可以帮我吗? 谢谢。

1 个答案:

答案 0 :(得分:3)

让我们在这里使用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