使用Pandas Groupby在Python中对Series按标签分组

3

可能是一个相当初学者的问题,但我正在学习如何在Python中使用Pandas。我想使用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

我想使用groupby按州和年份求和数字,但我希望包括所有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个回答

2

您需要使用reindex。但是,reindex与MultiIndex不兼容。您可以使用unstackstack

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

-1
  1. 从你的州列表中创建一个索引。(idx = pd.index(states)
  2. grouped.set_index(idx, inplace=True)
  3. grouped.fillna(value=0, inplace=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接