Убедитесь, что фрейм данных содержит содержимое в dict списков - PullRequest
3 голосов
/ 08 июля 2020

Я понимаю, что название немного нечеткое, но позвольте мне проиллюстрировать.

У меня есть фрейм данных, который (упрощенно) выглядит так:

Date | transaction | amount

01-01-2020 | something keywordA something | 50

01-01-2020 | something something keywordB | 152

02-01-2020 | keywordA something else | 200

et c

Затем первое, что я делаю, это добавляю пустой столбец под названием «категория», например:

df['Category'] = ''

Теперь у меня также есть список таких списков:

categories={'category A':['keywordA','keywordB'], 'category B':['keywordC']}

et c

Теперь я хочу посмотреть, содержит ли столбец транзакции для каждой строки одно из ключевых слов и содержит ли он, например. keywordA Я хочу, чтобы столбец категории был заполнен «категорией A».

Итак, во-первых, я не уверен, что использование dict списков - это способ go здесь. Во-вторых, я мог бы, вероятно, go строка за строкой, выполнить функцию типа contains и сравнить с каждым элементом в dict, но из того, что я прочитал, повторение каждой строки обычно является плохой практикой, когда вы используете pandas, и просто интуитивно это будет очень плохо масштабируется.

Итак ... какие-нибудь намеки на то, в каком направлении мне следует смотреть?

1 Ответ

5 голосов
/ 08 июля 2020

Насколько я понимаю, вы можете сделать это с помощью series.str.extract и series.map после изменения словаря:

d = {a:k for k,v in categories.items() for a in v}
#{'keywordA': 'category A', 'keywordB': 'category A', 'keywordC': 'category B'}
pat = r'\b(?:{})\b'.format('|'.join(d.keys()))
df['Category'] = df['transaction'].str.extract('('+pat+')',expand=False).map(d)
print(df)

        Date                   transaction  amount    Category
0 2020-01-01  something keywordA something      50  category A
1 2020-01-01  something something keywordB     152  category A
2 2020-02-01       keywordA something else     200  category A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...