Ошибка при извлечении только текста из строки в столбце в другой столбец в кадре данных Python с использованием регулярных выражений - PullRequest
2 голосов
/ 18 июня 2019

Я пытаюсь извлечь только текстовую часть в новый столбец из строковых данных в строках столбца в pandas dataframe.

Когда я пытался что-то вроде этого:

import pandas as pd
import re

df = pd.DataFrame({"Id": [1,2] , "Text" : ["This is 20/06/2019; 00:13:45; Time stamp", "This is another 23/04/2019 11:23:35 Time stamp"]})

print(df)

Я получил кадр данных, как показано ниже:

   Id                                            Text
0   1          This is 20/06/2019; 00:13:45; Time stamp
1   2  This is another 23/04/2019 11:23:35 Time stamp

Это нормально.

И затем я попытался извлечь только текстовые данные из строки в каждой строке столбца:

df['Text2']= re.findall(r'\w+', df['Text']) 

Вот где я получил ошибку:

TypeError                                 Traceback (most recent call last)
<ipython-input-5-b04317009801> in <module>
----> 1 df['Text2']= re.findall(r'\w+', df['Text'])
      2 
      3 print(df)

C:\Anaconda3\lib\re.py in findall(pattern, string, flags)
    221 
    222     Empty matches are included in the result."""
--> 223     return _compile(pattern, flags).findall(string)
    224 
    225 def finditer(pattern, string, flags=0):

TypeError: expected string or bytes-like object

В то время как я ожидал что-то вроде этого:

   Id                        Text
0   1          This is Time stamp
1   2  This is another Time stamp

Что я здесь сделал не так?

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Я предлагаю использовать

df['Text2'] = df['Text'].str.findall(r'[^\W\d_]{3,}').str.join(' ')

Или, чтобы соответствовать только целым словам (т. Е. Только тем, которые не «приклеены» к числам или подчеркиванию):

df['Text2'] = df['Text'].str.findall(r'\b[^\W\d_]{3,}\b').str.join(' ')

Шаблон [^\W\d_]{3,} будет соответствовать 3 или более любым фрагментам букв Unicode из содержимого, имеющегося в столбце Text.

.str.findall найдет все перекрывающиеся совпадения во входной строке и выведет список этих совпадений.

.str.join(' ') преобразует список значений в одну строку через пробел.

2 голосов
/ 18 июня 2019

Используйте Series.str.findall с Series.str.join с регулярным выражением для получения текста длиной 3 или более символов:

df['Text2']= df['Text'].str.findall(r'[A-Za-z]{3,}').str.join(' ')
print(df)
   Id                                            Text                    Text2
0   1        This is 20/06/2019; 00:13:45; Time stamp          This Time stamp
1   2  This is another 23/04/2019 11:23:35 Time stamp  This another Time stamp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...