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