Используйте регулярное выражение для извлечения элементов из фрейма данных Pandas - PullRequest
0 голосов
/ 07 января 2019

Из следующего фрейма данных:

d = {'col1':['a-1524112-124', 'b-1515', 'c-584854', 'a-15154']}

df = pd.DataFrame.from_dict(d)

Моя конечная цель - извлечь буквы a, b или c (в виде строки) из серии панд. Для этого я использую метод .findall() из модуля re, как показано ниже:

# import the module
import re
# define the patterns
pat = 'a|b|c'

# extract the patterns from the elements in the specified column
df['col1'].str.findall(pat)

Проблема в том, что выходные данные, то есть буквы a, b или c в каждой строке, будут присутствовать в списке (одного элемента), как показано ниже:

Out[301]: 
0    [a]
1    [b]
2    [c]
3    [a]

Хотя я хотел бы, чтобы буквы a, b или c были в виде строки, как показано ниже:

0    a
1    b
2    c
3    a

Я знаю, что если я объединю re.search() с .group(), я могу получить строку, но если я сделаю:

df['col1'].str.search(pat).group()

Я получу следующее сообщение об ошибке:

AttributeError: 'StringMethods' object has no attribute 'search'

Использование .str.split() не сработает, потому что в моем исходном кадре данных я хочу захватывать строки, которые могут содержать разделитель (например, я могу захотеть захватить a-b)

Кто-нибудь знает простое решение для этого, возможно, избегая итеративных операций, таких как цикл for или понимание списка?

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Исправьте ваш код

pat = 'a|b|c'
df['col1'].str.findall(pat).str[0]
Out[309]: 
0    a
1    b
2    c
3    a
Name: col1, dtype: object
0 голосов
/ 07 января 2019

Просто попробуйте с str.split () вот так- df["col1"].str.split("-", n = 1, expand = True)

import pandas as pd
d = {'col1':['a-1524112-124', 'b-1515', 'c-584854', 'a-15154']}
df = pd.DataFrame.from_dict(d)
df['col1'] = df["col1"].str.split("-", n = 1, expand = True) 
print(df.head())

Выход:

  col1
0    a
1    b
2    c
3    a
0 голосов
/ 07 января 2019

Использование экстракт с группами захвата:

import pandas as pd

d = {'col1':['a-1524112-124', 'b-1515', 'c-584854', 'a-15154']}

df = pd.DataFrame.from_dict(d)

result = df['col1'].str.extract('(a|b|c)')

print(result)

выход

   0
0  a
1  b
2  c
3  a
...