Нахождение частичных строк с помощью str.find (), а затем заменить значения из словаря - PullRequest
1 голос
/ 26 сентября 2019

Мне нужно заменить значения из столбца.Значения из столбца не обязательно должны совпадать, поэтому я использую str.find ().Как только он отсканирует строку, он должен заменить значения из словаря.

Я достиг желаемого результата для одного экземпляра, но мне нужно сделать это несколько раз.

Я попытался создать функциюно это не сработало.Это работало только для последнего значения словаря.

dictionary  = {"AA" : "111", "BB" : "222", "CC": "333,444"}

#result = []
for k, v in dictionary.items():
    df["renamed"] = np.nan
    df.loc[(df["combined_topic"].str.find(k) != -1), "renamed"] = v
    #result.extend(df["renamed"].to_dict(orient="records"))

Как мне исправить мой код?Или вы можете предложить более эффективный способ замены нескольких значений.

Ожидаемый результат:

combined_topic          renamed
AA, harvard                 111
Diliman, Technology, BB     222
Cat, Dog, CC, Bull          333, 444
``


1 Ответ

2 голосов
/ 26 сентября 2019

Используйте Series.str.extract для получения первого соответствующего значения словаря, а затем Series.map по dict:

pat = '|'.join(dictionary)
df['renamed'] = df['combined_topic'].str.extract('('+ pat + ')', expand=False).map(dictionary)
print (df)
            combined_topic  renamed
0              AA, harvard      111
1  Diliman, Technology, BB      222
2       Cat, Dog, CC, Bull  333,444

Ваше решение будет использоваться с Series.str.contains, но в основном удаляют df["renamed"] = np.nan, поскольку данные всегда перезаписываются в каждом цикле:

for k, v in dictionary.items():
    df.loc[df["combined_topic"].str.contains(k), "renamed"] = v

Или:

for k, v in dictionary.items():
    df.loc[(df["combined_topic"].str.find(k) != -1), "renamed"] = v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...