Pandas 熊猫:复杂的群体和巢穴

Pandas 熊猫:复杂的群体和巢穴,pandas,grouping,nested,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

下面是一个示例数据集。假设还有许多其他记录和更多的客户记录

 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级轿车的客户数量
  • 等等等等

这似乎涉及嵌套组,然后在分组的一个级别进行计数,但我被卡住了。也许只使用聚合函数为count的透视表是可行的,但我不保证这是最灵活的方法,但我认为使用两个groupby和一个
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)
然后我们可以对
客户
lev
进行分组,以确定每组中有多少辆车:

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