在double groupby之后,reset_index不会重置索引

时间:2019-04-16 20:00:09

标签: python pandas

当我使用pandas groupby按组对值求和并在另一个groupby中使用结果来计算每个子组内组总数的百分比时,我无法重置索引以通过切片访问列。如何访问列或重置索引?

test = pd.DataFrame({'Animal' : ['Falcon', 'Falcon','Parrot', 'Parrot','Mouse','Mouse'],'Type':['Bird', 'Bird', 'Bird', 'Bird', 'Rodent','Rodent'],'Count' : [380., 370., 24., 26., 1.9, 2.8]})

# second groupby gives a proportion of total animal counts within each type
gb = test.groupby(['Type','Animal']).sum().groupby(level=0).apply(lambda x: x / float(x.sum()))

当我拆栈时,我无法重置索引,以便可以提取列

gb = gb.unstack().reset_index()
gb.loc['Animal']

导致错误,表明没有名为“动物”的列。

如何在堆积后重新设置,以便可以对列进行子集化(或重命名它们,这现在可以替代)?

  • 编辑df示例以更清楚地说明问题

3 个答案:

答案 0 :(得分:1)

  

当我拆栈时,我无法重置索引,以便可以提取列

gb.unstack()
gb.loc['Animal']

您可以通过以下方式获得“动物”栏: gb.loc[:,'Animal'] 要么 gb['Animal']

答案 1 :(得分:0)

您要计算什么?

我认为第二个groupby操作不合适:

gb = test.groupby('Animal').sum().groupby(level=0).apply(lambda x: x / float(x.sum()))

尝试一下:

gb = test.groupby("Animal").sum().apply(lambda x: x / float(x.sum())).reset_index()

答案 2 :(得分:0)

您误读了该错误。错误是在索引而不是列中找不到“动物”。由于.loc的工作方式而引起的混乱。如果仅一项传递给.loc,则它将被解释为索引。仅第二项用于列。因此,您可以使用:

gb.loc[:, 'Animal']

但是您也可以简单地做到:

gb['Animal']