如何用自定义顺序排序Pandas的string列并自然排序number列?
实现自定义字符串列排序+数字列自然排序的方法
你的问题出在原代码里sort_values的key参数会作用于所有指定的列,导致number列也被尝试映射自定义字典,打乱了数字的自然排序逻辑。要实现字符串列按自定义顺序排,数字列按自然顺序排,可以用以下两种方法:
方法1:添加辅助列(兼容所有pandas版本)
先给string列生成对应的排序键辅助列,再按辅助列+number列排序,最后删掉辅助列:
import pandas import numpy strs = ['custom','sort']*5 df = pandas.DataFrame( { 'string': strs, 'number': numpy.random.randn(len(strs)), } ) sort_string_like_this = {'sort': 0, 'custom': 1} # 生成排序辅助列 df['sort_key'] = df['string'].map(sort_string_like_this) # 按辅助列升序,再按number列自然升序排序 sorted_df = df.sort_values(['sort_key', 'number']).drop('sort_key', axis=1) print(sorted_df)
方法2:针对列指定不同key(pandas 1.1.0+支持)
直接在sort_values的key参数里传字典,为每列单独指定排序处理逻辑:
import pandas import numpy strs = ['custom','sort']*5 df = pandas.DataFrame( { 'string': strs, 'number': numpy.random.randn(len(strs)), } ) sort_string_like_this = {'sort': 0, 'custom': 1} # string列用自定义字典映射排序,number列保持原数值顺序 sorted_df = df.sort_values( by=['string', 'number'], key={'string': lambda x: x.map(sort_string_like_this), 'number': lambda x: x} ) print(sorted_df)
两种方法最终都会输出符合预期的结果:string列按sort在前、custom在后的顺序排列,同一string分组内的number列从小到大自然排序。
内容的提问来源于stack exchange,提问作者user171780
相关产品推荐
相关产品推荐

