Как напечатать вхождение данной строки в столбец фрейма данных pandas? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующий фрейм данных.

import pandas as pd

data = [['Alexa',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
df

для проверки наличия определенных символов в столбце Имя.

mylist=['a','e']
pattern = '|'.join(mylist)
df['contains']=df['Name'].str.contains(pattern)

Приведенный выше код выдаст true или false, если присутствуют значения mylist.

Как получить столбец букв в выводе.

    Name    Age contains  letters
0   Alexa   10  True      e a 
1   Bob     12  False     
2   Clarke  13  True      a e

1 Ответ

0 голосов
/ 11 октября 2018

Здесь можно использовать пересечение set и понимание списка, которое будет быстрее, чем строковые методы pandas:

check = set('ae')
df.assign(letters=[set(n.lower()) & check for n in df.Name])

     Name  Age letters
0   Alexa   10  {a, e}
1     Bob   12      {}
2  Clarke   13  {a, e}

Альтернативой может быть что-то вроде:

df.assign(letters=df.Name.str.findall(r'(?i)(a|e)'))

     Name  Age    letters
0   Alexa   10  [A, e, a]
1     Bob   12         []
2  Clarke   13     [a, e]

Второй подход A) будет включать дубликаты, а B) будет медленнее:

In [89]: df = pd.concat([df]*1000)

In [90]: %timeit df.Name.str.findall(r'(?i)(a|e)')
2.34 ms ± 93.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [91]: %timeit [set(n.lower()) & check for n in df.Name]
1.45 ms ± 23.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...