2015-08-08 157 views
1

下面是一個示例數據集。假設有很多其他記錄和許多更多的客戶記錄。熊貓:複雜的分組和巢穴

customers = ['a','a','a','a','b','b','b','c','c','c'] 
level = [10,15,30,49,12,15,49,9, 22, 49] 
cars = ['bmw','audi','vw','mercedes','bmw','bmw','audi','audi', 'bmw', 'audi'] 
df = pd.DataFrame({'customers' : customers, 'levels' : level, 'cars': cars}) 

我試圖數:

  • 有1臺車的水平0-10
  • 有2輛汽車行駛等級0-10客戶的客戶#的#
  • 有3輛汽車行駛等級0-10
  • 有1臺車的水平10-20
  • 客戶說的#客戶#客戶#^ h AVE 2輛汽車行駛水平10-20
  • 有3輛汽車行駛水平10-20
  • 等等,等等

這似乎涉及嵌套組,然後計算在客戶#分組的一個級別,但我陷入困境。也許有工作,只是使用數據透視表與聚合函數作爲計數

回答

1

沒有承諾,這是最光滑的方式,但我認爲你可以得到你想要去兩個groupbys,並cut得到水平:

df["lev"] = pd.cut(df.levels, bins=range(0,100,10), right=False) 
dc = df.groupby(["customers", "lev"]).size().reset_index(name="count") 
dfinal = dc.groupby(["lev", "count"]).size() 

產生

>>> dfinal 
lev  count 
[0, 10) 1  1 
[10, 20) 2  2 
[20, 30) 1  1 
[30, 40) 1  1 
[40, 50) 1  3 
dtype: int64 

步驟一步,如果我們添加水平區間:

>>> df["lev"] = pd.cut(df.levels, bins=range(0,100,10), right=False) 
>>> df 
     cars customers levels  lev 
0  bmw   a  10 [10, 20) 
1  audi   a  15 [10, 20) 
2  vw   a  30 [30, 40) 
3 mercedes   a  49 [40, 50) 
4  bmw   b  12 [10, 20) 
5  bmw   b  15 [10, 20) 
6  audi   b  49 [40, 50) 
7  audi   c  9 [0, 10) 
8  bmw   c  22 [20, 30) 
9  audi   c  49 [40, 50) 

然後我們可以在customerslev組找出多少輛車有各組:

>>> dc = df.groupby(["customers", "lev"]).size().reset_index(name="count") 
>>> dc 
    customers  lev count 
0   a [10, 20)  2 
1   a [30, 40)  1 
2   a [40, 50)  1 
3   b [10, 20)  2 
4   b [40, 50)  1 
5   c [0, 10)  1 
6   c [20, 30)  1 
7   c [40, 50)  1 

而且由此我們可以指望有多少客戶有一定的利/計數配對:

>>> dfinal = dc.groupby(["lev", "count"])["customers"].size() 
>>> dfinal 
lev  count 
[0, 10) 1  1 
[10, 20) 2  2 
[20, 30) 1  1 
[30, 40) 1  1 
[40, 50) 1  3 
dtype: int64