Столбцы фрейма данных python pandas преобразуются в ключ и значение dict

У меня есть фрейм данных pandas с несколькими столбцами, и я хотел бы построить dict из двух столбцов: один как ключи dict, а другой как значения dict. Как я могу это сделать?

Фрейм данных:

           area  count
co tp
DE Lake      10      7
Forest       20      5
FR Lake      30      2
Forest       40      3

Мне нужно определить область как ключ, посчитать как значение в dict. Заранее спасибо.


person perigee    schedule 02.08.2013    source источник


Ответы (5)


Если lakes ваш DataFrame, вы можете сделать что-нибудь вроде

area_dict = dict(zip(lakes.area, lakes.count))
person punchagan    schedule 02.08.2013
comment
В версии 0.17.1 получить ошибку: TypeError: zip argument #2 must support iteration - person jezrael; 30.11.2015
comment
Решение: area_dict = dict(zip(lakes['area'], lakes['count'])) - person jezrael; 30.11.2015
comment
Я пробовал это, но получаю эту ошибку TypeError: zip argument #1 must support iteration - person Hardik Gupta; 18.12.2016
comment
Другие ответы на этот вопрос stackoverflow.com/questions/18695605/ - person Ben Fulton; 11.05.2017
comment
Что, если вы хотите, чтобы в значениях словаря было несколько столбцов? Я думаю что-то вроде area_dict = dict(zip(lakes.area, (lakes.count, lakes.other_column))). Как бы вы этого добились? - person Jesse Marks; 28.03.2019
comment
Если второй аргумент имеет несколько значений, это не сработает. - person pnv; 25.04.2019

С пандами это можно сделать так:

Если озера - это ваш DataFrame:

area_dict = lakes.to_dict('records')
person AnandSin    schedule 17.04.2018
comment
в данном примере нет столбца «записи». Также в этом случае индекс будет ключом, чего мы не хотим. - person Michael D; 13.06.2018
comment
@MichaelD 'records' - это не столбец. Это вариант для аргумента orient. - person Zheng Liu; 28.11.2018
comment
Это фактически выведет список словарей в следующем формате: [{'area': 10, 'count': 7}, {'area': 20, 'count': 5} ...] вместо ключа- ›Значение dict. - person Roei Bahumi; 09.12.2020

Вы также можете сделать это, если хотите поиграть с пандами. Однако мне нравится манера пунчагана.

# replicating your dataframe
lake = pd.DataFrame({'co tp': ['DE Lake', 'Forest', 'FR Lake', 'Forest'], 
                 'area': [10, 20, 30, 40], 
                 'count': [7, 5, 2, 3]})
lake.set_index('co tp', inplace=True)

# to get key value using pandas
area_dict = lake.set_index('area').T.to_dict('records')[0]
print(area_dict)

output: {10: 7, 20: 5, 30: 2, 40: 3}
person SammyRod    schedule 13.11.2018

Если фрейм данных «lakes» - это ваш фрейм данных, вы можете также сделать что-нибудь вроде:

# Your dataframe
lakes = pd.DataFrame({'co tp': ['DE Lake', 'Forest', 'FR Lake', 'Forest'], 
                 'area': [10, 20, 30, 40], 
                 'count': [7, 5, 2, 3]})
lakes.set_index('co tp', inplace=True)

Мое решение:

area_dict = lakes.set_index("area")["count"].to_dict()

или решение @punchagan (которое я предпочитаю)

area_dict = dict(zip(lakes.area, lakes.count))

Оба должны работать.

person Allan    schedule 03.05.2021

Отвечая на вопрос @Jessie Marks о том, как использовать этот подход dict (zip (***)), если вы хотите использовать несколько столбцов в качестве ключей / значений, ответ заключается в том, чтобы заархивировать zip-архивы; например.:

dict(zip(df['key'], zip(df["value col 1"], df_['value col 1'])))

или если вы хотите использовать несколько столбцов в качестве ключей:

dict(zip(zip(df['key 1'], df['key 2']), zip(df["value col 1"], df_['value col 1'])))

это сработало для меня на pandas v1.1.5; Python 3.6.13

PS. извините, я не отвечаю напрямую на вопрос @Jessie Marks, его новый аккаунт, и я пока не могу этого сделать.

person Forrest1988    schedule 12.05.2021