没有承诺,这是最光滑的方式,但我认为你可以得到你想要去两个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)
然后我们可以在customers
和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
而且由此我们可以指望有多少客户有一定的利/计数配对:
>>> 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