Поиск в диктонарке на основе подстановочного знака в пандах - PullRequest
0 голосов
/ 09 января 2019

Не могу найти хорошего решения для этого из stackoverflow. Мне удалось получить полное совпадение слов на основе итерации по списку и присвоения значения новому столбцу. Я полагаю, что для достижения того же самого можно использовать df.lookup, а также df.get_value и, возможно, также соединение ...

Это решение, которое я получил первым Это для поиска полных слов, но каков наилучший способ поиска на основе подстановочного знака и получения первого результата? Примером может служить список банковских транзакций с попыткой сопоставить названия магазинов с целью присвоения категории.

import pandas as pd
df = pd.read_csv("transactions.csv")

d = {
    'SUBWAY': '9',
    'TRANSFER TO': '5',
    'Best Buy': '8'
}

for index, row in df.iterrows():
    if(row['Description'] in d.keys()):
        df.at[index, 'Category'] = d[row['Description']]

1 Ответ

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

Частичное совпадение

Для частичных совпадений ключей словаря в пределах df['Description'] вы можете выполнить итерацию своего словаря вместо вашего фрейма данных:

d = {'IKEA': '9', 'TRANSFER TO SAVINGS': '5', 'Best buy': '8'}
for k, v in d.items():
    df.loc[df['Description'].str.contains(k), 'Category'] = v

Предполагая, что у вас есть большое количество строк относительно ключей словаря, это будет значительно более эффективно, чем итерация строк.

Будьте осторожны с порядком словаря. До версии 3.7 словари не следует считать упорядоченными. В CPython v3.6 и v3.7 + словари располагаются по порядку вставки. Вышеуказанная логика обеспечит последний матч стиков.

Точное совпадение

Для точных совпадений вы можете использовать pd.Series.map, за которым следует fillna:

d = {'IKEA': '9', 'TRANSFER TO SAVINGS': '5', 'Best buy': '8'}
df['Category'] = df['Description'].map(d).fillna(df['Category'])

Значение fillna важно, поскольку вы не хотите перезаписывать существующие значения в 'Category' с помощью NaN для случаев, когда 'Description' отсутствует в d.

Обычно менее эффективная альтернатива, которая позволяет избежать fillna, возможна через pd.Series.replace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...