Группировка по меткам в серии с использованием Pandas Группировка в Python - PullRequest
2 голосов
/ 04 мая 2020

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

State           Year         Number
Alabama         2010         2
Texas           2013         1
Mississippi     2011         6
Florida         2010         4
Alabama         2012         1
Texas           2010         8
Mississippi     2019         5
Florida         2017         3

Я бы хотел использовать группирование для суммирования чисел по штатам, а затем по годам, но я бы хотел включить все 50 штатов (поэтому у меня будет тонны нулей в этом примере).

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

grouped = df.groupby(['State', 'Year'])['Number'].sum()

Но если я попытаюсь сгруппировать по У меня есть серия из 50 имен штатов, подобная этой:

states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'District of Columbia', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Northern Mariana Islands', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming']
grouped = df.groupby([states, 'Year'])['Number'].sum()

Я сталкиваюсь с проблемами. Есть ли простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Вы в основном ищете reindex. Однако reindex не работает с MultiIndex. Вы можете unstack и stack:

grouped = df.groupby(['State','Year']).sum()
grouped.unstack('Year', fill_value=0).reindex(states, fill_value=0).stack()

Или объединить их в цепочку:

(df.groupby(['State','Year']).sum()
   .unstack('Year', fill_value=0)
   .reindex(states, fill_value=0)
   .stack()
)

Выход:

              Number
State   Year        
Alabama 2010       2
        2011       0
        2012       1
        2013       0
        2017       0
...              ...
Wyoming 2011       0
        2012       0
        2013       0
        2017       0
        2019       0
0 голосов
/ 04 мая 2020
  1. Сделайте индекс из вашего списка состояний. (idx = pd.index(states])
  2. grouped.set_index( idx, inplace=True)
  3. grouped.fillna(value=0, inplace=True)
...