我有一个示例数据框,类似于我在下面创建的合成框架。每个ID都归类为good
或bad
(这些也可能是国家/地区代码,例如US
,ES
,RU
等等:
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
现在,我想进行以下操作
例如,我会做前两个操作,如:
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
... .. ..
我的问题:我无法访问列ip
和how
。我可以对分组结果.hist()
,但我不能再分开数据了。
是否有更智能(更不用说,更正确)的方式来解决这个问题?
答案 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