2017-02-21 9 views
2

я пытаюсь извлечь некоторые данные из dataframe, однако следующий запрос только извлечь первый матч и игнорирует остальные матчи, например, если все данные:найти все регулярное выражение соответствует из колонки панды dataframe

df['value']= 
      0 123 blah blah blah, 456 blah blah blah, 129kfj blah blah 
      1 237 blah blah blah, 438 blah blah blah, 365kfj blah blah 
      ... 

и регулярное выражение:

df['newCol']=df['value'].str.extract("[0-9]{3}") 

я хочу, чтобы результат новое имя столбца "NEWCOL", как:

newCol 
------ 
123,456,129 
237,438,365 
... 

но фактический результат я получаю только первый номер:

newCol 
------ 
123 
237 

, что здесь не так? :(

спасибо

UPDATE:.

благодаря MaxU я нашел решение, только несколько предложений, которые я имел панда 0.18.1 так extractall не работали для меня до тех пор пока я обновил pandas до 0,19, поэтому не забудьте проверить свою версию pandas, если у вас есть проблема с Extractall ... second, apply (','. join) не работает для меня, потому что у меня были некоторые не строковые значения (значения Null), и это могло так что я использовал Лямбду и, наконец, работал с небольшой модификацией решения MaxU.

x['value'].str.extractall(r'(\d{3})').unstack().apply(lambda x:','.join(x.dropna()), axis=1) 
+0

'extract' возвращает только первый матч. Вы хотите ['extractall'] (http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.Series.str.extractall.html#pandas.Series.str.extractall). См. Ответ MaxU –

ответ

3

вы можете использовать Series.str.extractall() метод:

In [57]: x 
Out[57]: 
                value 
0 123 blah blah blah 456 blah blah blah 129kfj blah blah 
1 237 blah blah blah 438 blah blah blah 365kfj blah blah 

In [58]: x['newCol'] = x['value'].str.extractall(r'(\d{3})').unstack().apply(','.join, 1) 

In [59]: x 
Out[59]: 
                value  newCol 
0 123 blah blah blah 456 blah blah blah 129kfj blah blah 123,456,129 
1 237 blah blah blah 438 blah blah blah 365kfj blah blah 237,438,365 

UPDATE:

In [77]: x 
Out[77]: 
                 value 
0 123 blah blah blah, 456 blah blah blah, 129kfj blah blah 
1 237 blah blah blah, 438 blah blah blah, 365kfj blah blah 

In [78]: x['value'].str.extractall(r'(\d{3})').unstack().apply(','.join, 1) 
Out[78]: 
0 123,456,129 
1 237,438,365 
dtype: object 
+0

сейчас i ', получив эту ошибку: AssertionError: прошло 1 столбец, переданные данные имели 6 столбцов ... чтение этого (http://stackoverflow.com/questions/24145140/python-pandas-dataframe-read-from -records-assertionerror-1-columns-pass-pa) Я думаю, что он смотрит на «129kfj» как 1,2,9, k, f, j, но я не понимаю, почему – faranak777

+0

@Faranak, я не могу воспроизвести этот ошибка ... Можете ли вы попробовать шаг за шагом, чтобы увидеть, какая часть производит эту ошибку: 'x ['value']. ​​str.extractall (r '(\ d {3})')', 'x [' value ']. str.extractall (r' (\ d {3}) '). unstack() 'и т. д. – MaxU

+0

Я просто изменил извлечение на extractall и произвел эту ошибку: df [' value ']. str.extractall («[0-9] {3}») – faranak777

Смежные вопросы