简单问题:
b = 8143.1795845088482
d = 14723.523658084257
我的Df叫决赛:
Words score
This 90374.98788
is 80559.4495
a 43269.67002
sample 34535.01172
output Very Low
我希望将所有得分替换为“非常低”,“低”,“中等”或“高”,这取决于它们是否介于四分位数范围之间。
这样的作品:
final['score'][final['score'] <= b] = 'Very Low' #This is shown in the example above
但是当我尝试在它不起作用后立即播放时:
final['score'][final['score'] >= b] and final['score'][final['score'] <= d] = 'Low'
这给了我错误:无法分配运算符。谁知道我错过了什么?
答案 0 :(得分:1)
首先,您必须使用按位(例如&
,|
代替and
,or
)运算符,因为您要比较数组,因此所有值都不是单个值(比较像这样的数组变得模棱两可,加上你无法覆盖全局and
运算符以表现你想要的行为),其次,由于运算符的优先性,你必须在多个条件周围使用括号。
最后,您执行的chain indexing可能会或可能不会发出警告,并将列值设置为loc
,如下所示:
In [4]:
b = 25
d = 50
final.loc[(final['score'] >= b) & (final['score'] <= d), 'score'] = 'Low'
final
Out[4]:
Words score
0 This 10
1 is Low
2 for Low
3 You 704
答案 1 :(得分:1)
如果您的DataFrame的分数都是浮点数,
In [234]: df
Out[234]:
Words score
0 This 90374.98788
1 is 80559.44950
2 a 43269.67002
3 sample 34535.01172
然后您可以使用pd.qcut
按照四分位数对每个值进行分类:
In [236]: df['quartile'] = pd.qcut(df['score'], q=4, labels=['very low', 'low', 'medium', 'high'])
In [237]: df
Out[237]:
Words score quartile
0 This 90374.98788 high
1 is 80559.44950 medium
2 a 43269.67002 low
3 sample 34535.01172 very low
DataFrame列有一个dtype。当值都是浮点数时,它有一个浮点数dtype,对于数值计算来说可以非常快。当值是浮点数和字符串的混合时,则dtype为object
,这意味着每个值都是Python对象。虽然这给了这些值很大的灵活性,但它也非常慢,因为每个操作最终都会重新调用Python函数而不是NumPy / Panda C / Fortran / Cython函数。因此,您应该尽量避免在一列中混合浮点数和字符串。