pandas rank浮点数排名异常 高数值排位靠后问题如何解决
问题根因
排名逻辑异常和rank()函数本身无关,是twelve_m_yield字段的数据类型错误导致的:
- 该字段当前为字符串(object)类型,字符串排序遵循逐字符比对ASCII码的规则,第一位字符
9的编码大于第一位字符1,因此所有个位数开头的收益率(6.xx、8.xx、9.xx)都会被判定为大于两位数开头的收益率(11.xx、15.xx、17.xx),最终出现排名错乱。
修复代码
在执行排名逻辑前,先将字段转换为浮点数值类型即可得到正确结果:
# 第一步:将收益率字段转换为数值类型 df['twelve_m_yield'] = df['twelve_m_yield'].astype(float) # 原有排名逻辑保持不变 df = df[['twelve_m_yield']] df['ranking_twelve_m_yield'] = df['twelve_m_yield'].rank(ascending=False, method='first') df = df.sort_values(by=['ranking_twelve_m_yield']) print(df)
补充说明
- 可以提前执行
print(df.dtypes)查看各字段类型,只要参与数值计算、排序、排名的字段显示为object类型,都需要先做类型转换。 - 如果执行
astype(float)时报错,说明字段内存在非数值脏数据(比如带百分号、千分位逗号、特殊空值占位符等),需要先做清洗再转类型,例如字段带百分号时可以先做替换处理:df['twelve_m_yield'] = df['twelve_m_yield'].str.replace('%', '').astype(float)
内容的提问来源于stack exchange,提问作者Diogo Wernik
相关产品推荐
相关产品推荐

