2016-02-27 94 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