#python-3.x #pandas #loops #dictionary
#python-3.x #pandas #циклы #словарь
Вопрос:
У меня есть столбец ‘EDU’ в моем фрейме данных, df. где я пытался создать словарь с помощью value_counts(), poe_dict . Это выглядит так.
edu_m=df['EDU'].sort_values()
poe_dict = edu_m.value_counts(normalize=True).to_dict()
poe_dict
{4: 0.47974705779026877,
3: 0.24588090637625154,
2: 0.172352011241876,
1: 0.10202002459160373}
Теперь я пытаюсь заменить ключи ‘4,3,2,1’ этими строками, которые я поместил в список.
n_keys=[«колледж»,»больше, чем средняя школа, но не колледж», «средняя школа»,»меньше, чем средняя школа»]
Если я выполняю каждый из них по отдельности, все работает нормально, давая мне ожидаемый результат.
In:
poe_dict['college'] = poe_dict.pop(4)
poe_dict['more than high school but not college'] = poe_dict.pop(3)
poe_dict['high school'] = poe_dict.pop(2)
poe_dict['less than high school'] = poe_dict.pop(1)
Out:
{'college': 0.47974705779026877,
'more than high school but not college': 0.24588090637625154,
'high school': 0.172352011241876,
'less than high school': 0.10202002459160373}
однако, если я попытаюсь сделать это как цикл, это приведет к этому.
In:
for key, n_key in zip(poe_dict.keys(), n_keys):
poe_dict[n_key] = poe_dict.pop(key)
poe_dict
Out:
{2: 0.172352011241876,
1: 0.10202002459160373,
'high school': 0.47974705779026877,
'less than high school': 0.24588090637625154}
Итак, я не понимаю, почему цикл не работает для ключей 2 и 1?
Я также попытался отладить его, чтобы посмотреть, что происходит в подобном цикле.
In:
for key, n_key in zip(poe_dict.keys(), n_keys):
print (key,n_key)
poe_dict[n_key] = poe_dict.pop(key)
Out:
4 college
3 more than high school but not college
college high school
more than high school but not college less than high school
Ответ №1:
Вы перебираете ключи poe_dict в цикле for . Однако ключи poe_dict изменяются при выполнении инструкции is poe_dict[n_key] = poe_dict.pop(key)
. Поэтому информация о ключах становится неверной. Правильный способ — сохранить ключи peo_dict в список list(poe_dict.keys())
и перебирать этот новый список ключей.
poe_dict = {4: 0.47, 3:0.25, 2:0.17, 1:0.10}
n_keys = ['college', 'more than high school but not college','high school', 'less than high school' ]
keylist = list(poe_dict.keys())
for key, n_key in zip(keylist, n_keys):
print (key,n_key)
poe_dict[n_key] = poe_dict.pop(key)
print (poe_dict)
Результаты будут следующими
{'college': 0.47, 'more than high school but not college': 0.25, 'high school': 0.17, 'less than high school': 0.1}
Комментарии:
1. спасибо, сэр. Я не понимал, что оба они должны быть списками.