使用Python Pandas将客户分类为Deciles?

时间:2017-01-28 16:59:08

标签: python pandas dataframe

我有一个包含客户数据的数据框。每行属于不同的客户。其中一个数据框系列是2016年对客户的销售。我想将客户分类为十分位数。每个十分位数将占总销售额的十分之一。 Decile 10将拥有占销售总额前10%的顶级客户。

完成此任务的最简单方法是什么?

1 个答案:

答案 0 :(得分:3)

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