Pandas Groupby索引含负数,需按数值而非文本排序求助
解决Groupby索引负值按数值排序的问题
看起来你的问题出在索引的数据类型是字符串(object),而不是数值类型(int/float)。当索引是字符串时,sort_index()会按字典序(文本顺序)排序,而不是数值大小,这就导致了像-129这样的数值排在-2后面的奇怪结果。
下面是几种可行的解决方案:
方案1:先转换索引为数值类型再排序
这是最直接的方法,先把索引转换成整数,再执行排序:
# 分组统计 df_counts = df.groupby('DAYSLATE')[['DAYSLATE']].count() # 将索引转换为整数类型 df_counts.index = df_counts.index.astype(int) # 按数值排序 df_counts = df_counts.sort_index() # 后续的类型转换(如果需要) df_counts = df_counts.astype(int)
方案2:提前转换原数据列的类型
如果原DataFrame中的DAYSLATE列本身就是字符串类型,可以先把它转成数值类型再分组,这样分组后的索引自然是数值类型,排序就会正常:
# 先转换原列的类型为整数 df['DAYSLATE'] = df['DAYSLATE'].astype(int) # 分组并直接排序 df_counts = df.groupby('DAYSLATE')[['DAYSLATE']].count().sort_index()
方案3:使用sort_index的key参数(无需修改索引)
如果你不想修改索引的类型,可以在排序时通过key参数指定转换规则,让排序按数值逻辑进行:
df_counts = df.groupby('DAYSLATE')[['DAYSLATE']].count() # 按数值排序,key参数将索引临时转为整数 df_counts = df_counts.sort_index(key=lambda idx: idx.astype(int)).astype(int)
你可以先通过print(df_counts.index.dtype)验证一下索引的类型,如果输出是object,就说明确实是字符串类型导致的排序问题。按照上面的方法修改后,就能得到按数值从小到大排列的结果了(比如-230、-129、-3、-2、-1、0、1...这样的顺序)。
内容的提问来源于stack exchange,提问作者AlliDeacon
相关产品推荐
相关产品推荐

