首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将物品分组到一到十的桶中?

如何将物品分组到一到十的桶中?
EN

Stack Overflow用户
提问于 2020-01-21 14:01:00
回答 2查看 1.2K关注 0票数 2

我正在测试一个非常基本的代码行。

代码语言:javascript
复制
modDF['RatingDecile'] = pd.cut(modDF['RatingScore'], 10)

这给了我10个桶的评分范围。而不是范围,我如何才能看到1,2,3等,最多10?

所以不是这个。

代码语言:javascript
复制
      Score RatingQuantile  
0     (26.3, 29.0]  
6     (23.6, 26.3]  
7     (23.6, 26.3]  
8     (26.3, 29.0]  
10    (18.2, 20.9]  
       ...       ...  
9763  (23.6, 26.3]  
9769  (20.9, 23.6]  
9829  (20.9, 23.6]  
9889  (23.6, 26.3]  
9949  (20.9, 23.6] 

我怎么能得到这样的东西?

代码语言:javascript
复制
      Score RatingQuantile  
0     10  
6     8 
7     8 
8     10  
10    6  
       ...      ...  
9763  8  
9769  5  
9829  5 
9889  5  
9949  5 

我试过这个。

代码语言:javascript
复制
modDF['DecileRank'] = pd.qcut(modDF['RatingScore'],10,labels=False)

我犯了这个错误。

代码语言:javascript
复制
ValueError: Bin edges must be unique: array([ 2., 20., 25., 27., 27., 27., 27., 27., 27., 27., 29.]).
You can drop duplicate edges by setting the 'duplicates' kwarg

这个错误对我来说是有意义的。我只是不知道这个问题的解决办法。有什么想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-21 14:35:12

我想你要找的是:

代码语言:javascript
复制
modDF['RatingDecile'] = pd.cut(modDF['RatingScore'], 10, labels=range(1,11))
# or
modDF['RatingDecile'] = pd.cut(modDF['RatingScore'], 10, labels=False)

来自文档

标签:数组或bool,可选 指定返回回收箱的标签。必须与产生的回收箱长度相同。如果为False,则只返回回收箱的整数指示符。这会影响输出容器的类型(见下文)。当回收箱是IntervalIndex时,此参数将被忽略。

此外,如果要“覆盖”整个间隔[0,30],请指定bin边:

代码语言:javascript
复制
import numpy as np

modDF['RatingDecile'] = pd.cut(modDF['RatingScore'], 
                               bins=np.linspace(0, 30, 11), labels=False)

警告:注意到qcut

票数 1
EN

Stack Overflow用户

发布于 2020-01-21 14:11:27

如果传递了一个系列,我在使用qcut()时没有问题。我想你的数据看起来像我正在使用的数据。

代码语言:javascript
复制
import pandas as pd
import numpy as np
data = {'values':np.random.randint(1,30,size=1000)}
df = pd.DataFrame(data)
df['ranks'] = pd.qcut(df['values'],10,labels=False)
print(df)

输出:

代码语言:javascript
复制
     values  ranks
0        18      5
1        22      7
2         5      1
3        12      3
4        14      4
..      ...    ...
995      22      7
996      13      4
997      26      8
998       3      0
999      22      7

之后,您可以使用groupby()或其他一些函数检查简单的操作(例如,回收箱的限制):

代码语言:javascript
复制
df_info = df.groupby('ranks').agg(
        min_score=pd.NamedAgg(column='values',aggfunc='min'),
        max_score=pd.NamedAgg(column='values',aggfunc='max'),
        count_cases=pd.NamedAgg(column='values',aggfunc='count'))
print(df_info)

输出:

代码语言:javascript
复制
       min_score  max_score  count_cases
ranks                                   
0              1          3          137
1              4          5           72
2              6          8          105
3              9         11           96
4             12         14           98
5             15         17          107
6             18         20           91
7             21         23           99
8             24         27          121
9             28         29           74
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59842773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档