我正在测试一个非常基本的代码行。
modDF['RatingDecile'] = pd.cut(modDF['RatingScore'], 10)这给了我10个桶的评分范围。而不是范围,我如何才能看到1,2,3等,最多10?
所以不是这个。
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] 我怎么能得到这样的东西?
Score RatingQuantile
0 10
6 8
7 8
8 10
10 6
... ...
9763 8
9769 5
9829 5
9889 5
9949 5 我试过这个。
modDF['DecileRank'] = pd.qcut(modDF['RatingScore'],10,labels=False)我犯了这个错误。
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这个错误对我来说是有意义的。我只是不知道这个问题的解决办法。有什么想法?
发布于 2020-01-21 14:35:12
我想你要找的是:
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边:
import numpy as np
modDF['RatingDecile'] = pd.cut(modDF['RatingScore'],
bins=np.linspace(0, 30, 11), labels=False)警告:注意到qcut。
发布于 2020-01-21 14:11:27
如果传递了一个系列,我在使用qcut()时没有问题。我想你的数据看起来像我正在使用的数据。
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)输出:
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()或其他一些函数检查简单的操作(例如,回收箱的限制):
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)输出:
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 74https://stackoverflow.com/questions/59842773
复制相似问题