熊猫:复杂的分组和巢

时间:2015-08-08 03:48:09

标签: pandas grouping nested

这是一个示例数据集。假设有许多其他记录和许多客户记录。

 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级别车辆的客户数
  • 拥有2辆10-20级别车辆的客户数
  • 拥有3辆10-20级别车辆的客户数
  • 等。等

这似乎涉及嵌套组,然后计入分组的一个级别,但我陷入困境。也许只需使用具有聚合函数的数据透视表作为计数

1 个答案:

答案 0 :(得分:1)

没有承诺这是最简单的方式,但我认为你可以通过两个小组获得你想去的地方,并且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

从中我们可以计算出一定数量的lev / count对的客户数量:

>>> 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