我有一个包含客户数据的数据框。每行属于不同的客户。其中一个数据框系列是2016年对客户的销售。我想将客户分类为十分位数。每个十分位数将占总销售额的十分之一。 Decile 10将拥有占销售总额前10%的顶级客户。
完成此任务的最简单方法是什么?
答案 0 :(得分:3)
pandas
有pd.qcut
方法,当应用于Series
时,会返回categorical series(a DataFrame
的行为类似)。因此,要获得分类索引,您可以执行以下操作:
>>> import pandas as pd
# mock data
>>> df = pd.DataFrame({'sales_total': [1,2,162,126,126,12,7,1236,16,132,61,51]})
>>> cat_srs = pd.qcut(df['sales_total'], 10)
>>> print(cat_srs)
<<< 0 [1, 2.5]
1 [1, 2.5]
2 (159, 1236]
3 (1, 126]
4 (1, 126]
5 (8, 13.2]
6 (2.5, 8]
7 (159, 1236]
8 (13.2, 3]
9 (130.8, 159]
10 (56, 1]
11 (3, 56]
Name: dat, dtype: category
Categories (10, object): [...]
您可以使用values
运算符获取系列条目,然后从那里使用codes
运算符获取其bin代码:
>>> deciles = cat_srs.values.codes
>>> print(deciles)
<<< array([0, 0, 9, 6, 6, 2, 1, 9, 3, 8, 5, 4], dtype=int8)
您需要的是什么。在这里,您可以使用df['decile'] = deciles
将分数分配给数据,使用df.groupby('decile')
分配分组,依此类推。
以上所有内容均为pd.qcut(df['sales_total'], 10).values.codes
。
编辑:根据评论回答下面的修改过的问题 - 我不知道这样做的方法已经融入了库中。但假设您的数据相对连续,您可以自己构建类:
target = df['sales_total'].sum() / 10
deciles = []
sum = 0
classifier = 0
for val in df['sales_total']:
deciles.append(classifier)
sum += val
if sum > target:
classifier += 1
sum = 0