按计数分组和聚合:如何保留列名?

时间:2015-05-20 15:53:05

标签: python pandas

我有一个示例数据框,类似于我在下面创建的合成框架。每个ID都归类为goodbad(这些也可能是国家/地区代码,例如USESRU等等:

In [55]: nf = pandas.DataFrame({'id': numpy.random.randint(0,100,1000)
                               ,'how':numpy.random.choice(['good','bad'],1000)
                               ,'A':numpy.random.randn(1000)
                               ,'B':numpy.random.randn(1000)
                               })

In [56]: for i in numpy.unique(nf['id'].values):
  .....:     nf.loc[nf.loc[idx[:],idx['id']] == i, 'how'] = "good" if is_odd(i) else "bad"

我通过以下方式确定is_odd()

def is_odd(num):
    return num & 0x1

现在,我想进行以下操作

  • 按ID分组数据
  • 计算每个组的条目/行
  • 绘制整个人口的计数直方图
  • 绘制直方图的" good"和"坏"

例如,我会做前两个操作,如:

In [57]: nf.groupby(['id','how']).agg('count')
Out[57]: 
          A   B
id how         
0  bad    9   9
1  good  13  13
2  bad   16  16
3  good   8   8
4  bad    7   7
5  good  11  11
6  bad   10  10
7  good  14  14
8  bad   12  12
9  good   8   8
10 bad   12  12
...      ..  ..

我的问题:我无法访问列iphow。我可以对分组结果.hist(),但我不能再分开数据了。

是否有更智能(更不用说,更正确)的方式来解决这个问题?

1 个答案:

答案 0 :(得分:2)

您可以使用pandas.DataFrame.reset_index()将多索引转换为列:

In [6]: nf.groupby(['id','how']).agg('count').reset_index().head(10)
Out[6]: 
   id   how   A   B
0   0   bad   7   7
1   0  good   6   6
2   1   bad   5   5
3   1  good   5   5
4   2   bad   6   6
5   2  good   4   4
6   3   bad   3   3
7   3  good   7   7
8   4   bad  11  11
9   4  good   6   6

另一种方法是使用pandas.DataFrame.groupby()的<{1}}参数:

as_index