全部,
我试图将我的数据分成三个部分,即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"], q=[0, 0.4, 0.8, 1],
labels=["lowest", "middle", "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%']