2015-08-08 154 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