我如何将熊猫中的数据拆分到指定的存储桶中,例如40-40-20?

问题描述

全部,

我试图将我的数据分成 3 个桶,分别为 40%、40% 和 20%。我如何使用熊猫来做到这一点? 例如所以你会得到最低的 40%、中间的 40% 和最高的 20% :

pd.cut(df['count'],5,labels = ['1','2','3','4','5'],retbins=True)

以上分为 5 个五分位数,但我想定义 40:40:20 百分位数。

有什么想法吗?

解决方法

改用qcut

df["quantile"] = pd.qcut(df["count"],q=[0,0.4,0.8,1],labels=["lowest","middle","top"])
>>> df.sort_values("count")

    count quantile
4       5   lowest
7       7   lowest
6       9   lowest
15      9   lowest
5      17   lowest
1      19   lowest
9      22   lowest
2      25   lowest
16     25   lowest
12     29   middle
19     31   middle
18     32   middle
0      32   middle
10     36   middle
14     38   middle
3      39   middle
8      44      top
11     47      top
17     47      top
13     48      top

获取垃圾箱:

df["quantile"],bins = pd.qcut(df["count"],"top"],retbins=True)
,

您走在正确的道路上。根据您问题中的措辞,我不确定您是否要根据可能值的范围或值的实际分布对数据进行分类。两个我都会展示。

使用 pd.cut() 根据可能值的范围对数据进行分箱。 使用 pd.qcut() 根据值的实际分布对数据进行分箱。

import pandas as pd
import numpy as np

data = np.random.randint(0,100,100)
labels = ['Bottom 40%','Middle 40%','Top 20%']

# bin data based on range of possible values
df['possible'] = pd.cut(df['count'],[0,40,80,100],labels=labels)

# bin data based on distribution of values
df['distribution'] = pd.qcut(df['count'],[0.,.4,.8,1.],labels=labels)

top20possible = df.loc[df['possible'] == 'Top 20%']
top20distribution = df.loc[df['distribution'] == 'Top 20%']