#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 секунд. Хотя это работает, я уверен, что есть лучшие решения. Любые предложения будут приветствоваться.