Pandas将值添加到层次结构索引的内部水平

5

我有一个带有层次化索引(MultiIndex)的Pandas DataFrame。我通过对“ cousub”和“ year”进行分组来创建此DataFrame。

annualMed = df.groupby(["cousub", "year"])[["ratio", "sr_val_transfer"]].median().round(2)
print annualMed.head(8)    

                      ratio  sr_val_transfer
cousub          year                        
Allen Park city 2013   0.51          75000.0
                2014   0.47          85950.0
                2015   0.47          95030.0
                2016   0.45         102500.0
Belleville city 2013   0.49         113900.0
                2014   0.55         114750.0
                2015   0.53         149000.0
                2016   0.48         121500.0    

我希望在"年"级别中添加一个"总体"值,然后再根据"cousub"分组填充值,即排除"年"。我希望结果看起来像下面这样

                      ratio  sr_val_transfer
cousub          year                        
Allen Park city 2013   0.51          75000.0
                2014   0.47          85950.0
                2015   0.47          95030.0
                2016   0.45         102500.0
             Overall   0.50          90000.0
Belleville city 2013   0.49         113900.0
                2014   0.55         114750.0
                2015   0.53         149000.0
                2016   0.48         121500.0 
             Overall   0.50         135000.0

我该如何将此新项添加到MultiIndex的“年份”级别中呢?
1个回答

3

如果您只想明确添加这两列,可以使用 loc 指定所有 MultiIndex 级别。

df.loc[('Allen Park city', 'Overall'), :] = (0.50, 90000.)
df.loc[('Belleville city', 'Overall'), :] = (0.50, 135000.)

如果你有一整个城市的列表需要添加这一行,那么这样做可能会有点繁琐。也许你可以使用一些索引操作将带有“overall”值的另一个DataFrame附加到数据中。
(df.reset_index()
   .append(pd.DataFrame([['Allen Park city', 'Overall', 0.5, 90000.], 
                         ['Belleville city', 'Overall', 0.5, 135000.]], 
                         columns=list(df.index.names) + list(df.columns)))
   .set_index(df.index.names)
   .sort_index())

演示

方法一(小写)


(注:此处为演示和方法一的翻译)
>>> df.loc[('Allen Park city', 'Overall'), :] = (0.50, 90000.)

>>> df.loc[('Belleville city', 'Overall'), :] = (0.50, 135000.)

>>> df.sort_index()

                         ratio  sr_val_transfer
cousub          year                           
Allen Park city 2013      0.51          75000.0
                2014      0.47          85950.0
                2015      0.47          95030.0
                2016      0.45         102500.0
                Overall   0.50          90000.0
Belleville city 2013      0.49         113900.0
                2014      0.55         114750.0
                2015      0.53         149000.0
                2016      0.48         121500.0
                Overall   0.50         135000.0

方法2(更大的情况)

>>> (df.reset_index()
       .append(pd.DataFrame([['Allen Park city', 'Overall', 0.5, 90000.], 
                             ['Belleville city', 'Overall', 0.5, 135000.]], 
                             columns=list(df.index.names) + list(df.columns)))
       .set_index(df.index.names)
       .sort_index())

                         ratio  sr_val_transfer
cousub          year                           
Allen Park city 2013      0.51          75000.0
                2014      0.47          85950.0
                2015      0.47          95030.0
                2016      0.45         102500.0
                Overall   0.50          90000.0
Belleville city 2013      0.49         113900.0
                2014      0.55         114750.0
                2015      0.53         149000.0
                2016      0.48         121500.0
                Overall   0.50         135000.0

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