Проверка одного столбца и возвращение другого столбца в Pandas кадре данных - PullRequest
4 голосов
/ 11 февраля 2020

У меня есть такой фрейм данных:

   Title                Participants
0  ShowA            B. Smith,C. Ball
1  ShowB                   T. Smooth
2  ShowC  K. Dulls,L. Allen,B. Smith

Я делю на , в столбце Участники и создаю список для каждой ячейки. Затем я проверяю, указаны ли c участников в каждом списке. В этом примере я проверяю B. Smith или K. Dulls

for item in df['Participants']:
    listX = item.split(',')
    if 'B. Smith' in listX or 'K. Dulls' in listX:
        print(listX)

Это возвращает:

['B. Smith', 'C. Ball']
['K. Dulls', 'L. Allen', 'B. Smith']

1) Я предполагаю, что есть более чистый способ проверьте для нескольких участников, в моем if заявлении. Я буду рад любым предложениям.

2) Здесь я крутился по кругу, как мне вернуть Title, связанный с списком (ями), которые я возвращаю?

В этом примере я хотел бы вернуть:

ShowA
ShowC

Код установки:

import pandas as pd

df = pd.DataFrame(data={'Title': ['ShowA', 'ShowB', 'ShowC'],
                        'Participants': ['B. Smith,C. Ball', 'T. Smooth', 'K. Dulls,L. Allen,B. Smith']})

target_participants = ['B. Smith', 'K. Dulls']

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

get_dummies

Вы можете использовать pandas.Series.str.get_dummies и создать фрейм данных, где столбцы являются логическими выражениями присутствия имен.

dummies = df.Participants.str.get_dummies(',').astype(bool)
dummies

   B. Smith  C. Ball  K. Dulls  L. Allen  T. Smooth
0      True     True     False     False      False
1     False    False     False     False       True
2      True    False      True      True      False

Тогда мы сможем найти ваш результат

df.loc[dummies['B. Smith'] | dummies['K. Dulls'], 'Title']

0    ShowA
2    ShowC
Name: Title, dtype: object

contains

В противном случае вы можете использовать pandas.Series.str.contains. Сначала нам нужно указать в списке людей, которых вы ищете, а затем составить строку для использования в качестве регулярного выражения.

people_to_look_for = ['B. Smith', 'K. Dulls']
pattern = '|'.join(people_to_look_for)
mask = df.Participants.str.contains(pattern)
df.loc[mask, 'Title']

0    ShowA
2    ShowC
Name: Title, dtype: object
1 голос
/ 11 февраля 2020

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

import pandas as pd

df = pd.DataFrame(data={'Title': ['ShowA', 'ShowB', 'ShowC'],
                        'Participants': ['B. Smith,C. Ball', 'T. Smooth', 'K. Dulls,L. Allen,B. Smith']})

target_participants = {'B. Smith', 'K. Dulls'}

df['Participants'] = df['Participants'].str.split(',')

print(df, end='\n\n')

contains_parts = ~df['Participants'].map(target_participants.isdisjoint)

print(contains_parts)

Вывод:

   Title                    Participants
0  ShowA             [B. Smith, C. Ball]
1  ShowB                     [T. Smooth]
2  ShowC  [K. Dulls, L. Allen, B. Smith]

0     True
1    False
2     True
Name: Participants, dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...