替换落在两个值之间的数字(Pandas,Python3)

时间:2014-09-30 22:39:21

标签: python-3.x pandas

简单问题:

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'

这给了我错误:无法分配运算符。谁知道我错过了什么?

2 个答案:

答案 0 :(得分:1)

首先,您必须使用按位(例如&|代替andor)运算符,因为您要比较数组,因此所有值都不是单个值(比较像这样的数组变得模棱两可,加上你无法覆盖全局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函数。因此,您应该尽量避免在一列中混合浮点数和字符串。