2015-08-06 2 views
1

Я хочу создать словарь, в котором ключ является именем состояния, а значение представляет собой сумму всего количества, соответствующего состоянию.Создание словаря из DataFrame, Pandas, Python

Пример из dataFrame

State   Count 
California 100 
Colorado  100 
California 54 
Colorado  9254 

Я пытался использовать следующее, но не знаете, как включить функцию суммы внутри этого, и не уверен, если я должен использовать метод зип здесь:

df_dict = dict(zip(df.State, df.Count)) 
print df_dict 

ответ

1

Вычислить сумму по группе в dataframe, а затем выберите 'Count' колонки и использовать to_dict() преобразовать получившиеся серии словаря:

df_dict = df.groupby('State').agg('sum')['Count'].to_dict() 
print df_dict 

Если у вас есть несколько столбцов в ФРЕ, чем те два вы, вероятно, захотите сделать

df[['State','Count']].groupby('State').agg('sum')['Count'].to_dict() 

, чтобы избежать вычисления суммы для всех столбцов.

Edit:

, как EdChum предложил .agg('sum') может быть сокращен до .sum(), который дает тот же результат.

+0

отлично, не уверен, что требуется ['Count']. если я что-то не хватает? @Pekka – madman

+0

Нужно выбрать первый (только в этом случае) столбец из результирующего DataFrame. Попробуйте это без него. Вы получите вложенный словарь. В этом случае ваш желаемый результат находится в ключе «Count». – Pekka

+0

Итак, когда мы используем '['Count']' selection, мы получаем Series вместо DataFrame. Затем мы преобразуем серию (а не DataFrame) в словарь. Обратите внимание, что также DataFrames можно преобразовать в словарь с помощью 'to_dict()', но результат отличается (вложенный dict). См.: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.to_dict.html и http://pandas.pydata.org/pandas-docs/stable/generated/ pandas.DataFrame.to_dict.html – Pekka

1

Это не сработает должным образом, так как конструктор dict заменит значение каждого state, как оно идет, вместо того, чтобы суммировать. Это не один лайнер, но:

from collections import Counter 

df_dict = Counter() 
for state, count in zip(df.State, df.Count): 
    df_dict[state] += count 

получит Вас общий счет, а Counter класса имеет некоторые дополнительные функциональные возможности, которые могут быть полезны для словарей графов.

Смежные вопросы