Производительность: замена значений рядов ключами из словаря в Python

#performance #for-loop #python-3.6

#Производительность #для цикла #python-3.6

Вопрос:

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

 # For example, corporation_series is:
0 'Corp1'
1 'Corp-1'
2 'Corp 1'
3 'Corp2'
4 'Corp--2'
dtype: object

# Dictionary is:
mapping_dict = { 
    'Corporation_1': ['Corp1', 'Corp-1', 'Corp 1'],
    'Corporation_2': ['Corp2', 'Corp--2'],
}

# I use this logic to replace the values in the series
for index, value in corporation_series.items():
    for key, list in mapping_dict.items():
        if value in list:
            corporation_series = corporation_series.replace(value, key)
 

Итак, если ряд имеет значение ‘Corp1’ и оно существует в значениях словаря, логика заменяет его соответствующим ключом корпораций. Однако это чрезвычайно дорогой метод. Может ли кто-нибудь порекомендовать мне лучший способ выполнения этой операции? Очень признателен.

Ответ №1:

Я нашел решение, используя функцию python .map . Чтобы использовать .map, мне пришлось инвертировать свой словарь:

 # Inverted Dict:
mapping_dict = { 
    'Corp1': ['Corporation_1'],
    'Corp-1': ['Corporation_1'],
    'Corp 1': ['Corporation_1'],
    'Corp2': ['Corporation_2'],
    'Corp--2':['Corporation_2'],
}

# use .map
corporation_series.map(newdict)
 

Вместо 5 минут обработки потребовалось около 5 секунд. Хотя это работает, я уверен, что есть лучшие решения. Любые предложения будут приветствоваться.