Разбить строку несколько раз и вернуть результат как новый DataFrame - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь разбить столб панд несколько раз.Я хочу найти строку между двумя строками на неопределенный срок.Например, допустим, у меня есть столбец панд из входных данных ниже:

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 голосов
/ 19 декабря 2018

Давайте использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...