2016-02-27 96 views
3

我使用熊猫的一些数据处理,我的熊猫声明看起来像这样如何在多列上使用group by?

yearage.groupby(['year', 'Tm']).size() 

它使我的数据是这样

2014 ATL  9 
     BOS  9 
     BRK  7 
     CHI 10 
     CHO  9 
     CLE  8 
     DAL  9 
     DEN  8 
     DET  9 
     GSW  8 

当我把它转换成数据帧,我只得到两列复合钥匙和计数。我真正想要的是,三列,

year, Tm, Size 

如何groupby后分离出两个化合物的钥匙?

+0

你如何转换为'df'?通过'reset_index()'? – jezrael

+0

这是一个'Series',你可以通过'reset_index()'将其转换为'DataFrame'。 –

+0

只是简要说明一下以前的评论,你有一个MulitIndex而不是平面索引那里B/C你分组在多列。 reset_index只是将你从'['year','tm']'索引转换为标准'range(x)'索引。 – JohnE

回答

3

您在groupby语句中指定as_index=False。作为一个附注,你可能想要使用count(不包括NaN)而不是size。

>>> df.groupby(['year', 'Tm'], as_index=False).count() 
    year Tm a 
0 2014 ATL 4 
1 2014 BOS 4 
2 2014 BRK 1 
3 2014 CHI 1 
4 2014 CHO 1 
5 2014 CLE 1 
6 2014 DAL 1 
7 2014 DEN 1 
8 2014 DET 1 
9 2014 GSW 1 

对于尺寸:

另一个简单的聚合例子是计算各组的大小。这包含在GroupBy中作为大小方法。它返回一个Series,其索引是组名,其值是每个组的大小。

对于计数:组

计算数量,不包括遗漏值

+0

我在想同样的答案,但试过了,它不适用于size(),我没有意识到它可以用于count()。不知道为什么行为在大小和数量上有所不同? – JohnE

+0

很奇怪。我得到了相同的结果,只是当我使用'size'而不是'count'时,它将'year'和'Tm'设置为MultiIndex。 – Alexander

2

我想你可以尝试reset_index对新列名Size参数name

yearage.groupby(['year','Tm']).size().reset_index(name='Size') 

样品:

print yearage 
    year Tm a 
0 2014 ATL 9 
1 2014 ATL 9 
2 2014 ATL 9 
3 2014 ATL 9 
4 2014 BOS 9 
5 2014 BRK 7 
6 2014 BOS 9 
7 2014 BOS 9 
8 2014 BOS 9 
9 2014 CHI 10 
10 2014 CHO 9 
11 2014 CLE 8 
12 2014 DAL 9 
13 2014 DEN 8 
14 2014 DET 9 
15 2014 GSW 8 

print yearage.groupby(['year','Tm']).size().reset_index(name='Size') 
    year Tm Size 
0 2014 ATL  4 
1 2014 BOS  4 
2 2014 BRK  1 
3 2014 CHI  1 
4 2014 CHO  1 
5 2014 CLE  1 
6 2014 DAL  1 
7 2014 DEN  1 
8 2014 DET  1 
9 2014 GSW  1 

不带参数name得到新的列0

print yearage.groupby(['year','Tm']).size().reset_index() 
    year Tm 0 
0 2014 ATL 4 
1 2014 BOS 4 
2 2014 BRK 1 
3 2014 CHI 1 
4 2014 CHO 1 
5 2014 CLE 1 
6 2014 DAL 1 
7 2014 DEN 1 
8 2014 DET 1 
9 2014 GSW 1