2016-09-16 5 views
1

У меня есть фрейм данных pandas, который содержит строки различной длины и символов.Фильтрация кадра данных pandas на основе совпадения с частичными строками

Например:

print df['name'][0] 
print df['name'][1] 
print df['name'][2] 
print df['name'][3] 

бы вернуть что-то вроде этого:

UserId : Z5QF1X33A 
loginId : test.user 
UserId : 0000; searchText : Cap 
accountSampleToExclude : 0; accountSampleName : Sample Text; UserId : Z5QF1X33A; accountSampleType : Test; accountSample : Test 

То, что я хочу сделать, это быть в состоянии разобрать через колонку и возвращать только фактическое отношение идентификатор так на основе приведенный выше пример:

Z5QF1X33A 
test.user 
0000
Z5QF1X33A 

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

df['name'] = df['name'].str.strip(r'(?<=\UserId :).*') 
df['name'] = df['name'].str.strip(r'(?<=\loginId :).*') 

Это будет работать для строк, которые похожи на

df['name'][0] 
df['name'][1] 

, но не будет работать для других случаев. Любая помощь была бы высоко оценена, я понимаю, что ее можно было бы решить без регулярного выражения, возможно, просто с методом str.split(), но не уверен, как действовать в pythonic и/или pandas.

ответ

0

попробовать это:

In [31]: df.name.str.extract(r'\b(?:UserId|loginId)\s*:\s*\b([^\s]+)\b', expand=True) 
Out[31]: 
      0 
0 Z5QF1X33A 
1 test.user 
2 0000
3 Z5QF1X33A 
+0

Это работает для примера, однако, есть более вещий способ приблизиться к этому (без использования регулярных выражений?), Что не слишком многословен. – astateofsanj

+0

@ user3356075, что случилось с «использованием регулярных выражений»? – MaxU

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