如何将DataFrame中字符串型列值移至升序排序后的底部?
解决DataFrame排序时将字符串值移至底部的问题
我来帮你搞定这个排序问题~你遇到的核心原因是:Python中字符串与数值比较时,字符串会被判定为更小的值,所以'unavailable'会排在所有数值前面。下面给你两种实用的解决方案:
方法一:拆分数据后合并(直观易理解)
把数值行和含'unavailable'的行分开处理,先排序数值行,再把字符串行追加到底部:
import pandas as pd # 先执行你的替换操作(如果需要的话) final_df = final_df.replace(0.00, 'unavailable') # 筛选出所有Prix列不是'unavailable'的行 numeric_rows = final_df[final_df['Prix'] != 'unavailable'] # 对数值行按Prix升序排序 sorted_numeric = numeric_rows.sort_values('Prix', ascending=True) # 筛选出含'unavailable'的行 unavailable_rows = final_df[final_df['Prix'] == 'unavailable'] # 合并两个结果,数值行在前,字符串行在后,重置索引 final_df = pd.concat([sorted_numeric, unavailable_rows]).reset_index(drop=True)
方法二:自定义排序键(简洁高效)
利用sort_values的key参数,给'unavailable'设置一个超大的排序权重(比如无穷大),这样它自然会排在所有数值后面:
import pandas as pd # 先完成替换操作 final_df = final_df.replace(0.00, 'unavailable') # 自定义排序键:将'unavailable'转为无穷大,其他值转为float后排序 final_df = final_df.sort_values( by='Prix', ascending=True, key=lambda col: col.apply(lambda val: float('inf') if val == 'unavailable' else float(val)) ).reset_index(drop=True)
小提示
如果你的Prix列数据类型比较混杂,建议先做一次数据清洗,确保能转为数值的都转为数值类型,这样后续操作会更稳定。比如可以用pd.to_numeric配合errors='coerce'来处理:
final_df['Prix'] = pd.to_numeric(final_df['Prix'], errors='coerce').fillna('unavailable')
内容的提问来源于stack exchange,提问作者Murcielago
相关产品推荐
相关产品推荐

