基于最后一列值对DataFrame内容排序失败问题求助
问题:无法按最后一列数值正确排序DataFrame
问题背景
尝试读取sampledata.txt并按最后一列值排序展示,但设置ascending=True/False后仍无法得到预期结果。
源文件sampledata.txt内容
ADS43 11.468 02:45 982AS2S 5.657 02:45 K72KSU3 -3.398 02:45 JJS7AS 3.238 02:45 LO92SA 2.221 02:45 22SA8A -1.931 02:45 ADS43 11.468 03:00 982AS2S -5.657 03:00 K72KSU3 3.398 03:00 JJS7AS -2.238 03:00 LO92SA 7.221 03:00 111AS2 -10.756 03:00 P352AS -1.912 03:30 982AS2S -12.595 03:30 K72KSU3 -9.153 03:30 JJS7AS 12.238 03:30 LO92SA 17.221 03:30 111AS2 -13.756 03:30
当前代码(排序逻辑错误)
data = {} for row in open('sampledata.txt'): cols = row.rstrip().split() if cols[2] not in data: data[cols[2]] = {} data[cols[2]][cols[0]] = cols[1] df = pd.DataFrame(data) df2 = df.sort_values(by=[df.columns[-1]], ascending=False) print (df2)
当前输出
02:45 03:00 03:30 LO92SA 2.221 7.221 17.221 JJS7AS 3.238 -2.238 12.238 K72KSU3 -3.398 3.398 -9.153 111AS2 NaN -10.756 -13.756 982AS2S 5.657 -5.657 -12.595 P352AS NaN NaN -1.912 ADS43 11.468 11.468 NaN 22SA8A -1.931 NaN NaN
预期输出(按最后一列值从大到小排序)
02:45 03:00 03:30 LO92SA 2.221 7.221 17.221 JJS7AS 3.238 -2.238 12.238 P352AS NaN NaN -1.912 K72KSU3 -3.398 3.398 -9.153 982AS2S 5.657 -5.657 -12.595 111AS2 NaN -10.756 -13.756 ADS43 11.468 11.468 NaN 22SA8A -1.931 NaN NaN
问题原因及解决方案
问题根源
当前代码构建的DataFrame中,最后一列(03:30)存储的是字符串类型,而非数值类型。排序时会按字符串的字典序(而非数值大小)排序,导致-1.912这类数值的排序位置错误。
修正代码
import pandas as pd # 读取数据并转换数值类型 data = [] with open('sampledata.txt', 'r') as f: for row in f: cols = row.strip().split() # 将数值列转为float类型 data.append([cols[0], float(cols[1]), cols[2]]) # 转换为DataFrame并重塑为宽表 df = pd.DataFrame(data, columns=['ID', 'Value', 'Time']) pivot_df = df.pivot(index='ID', columns='Time', values='Value') # 按最后一列数值降序排序 sorted_df = pivot_df.sort_values(by=pivot_df.columns[-1], ascending=False) print(sorted_df)
说明
- 读取数据时直接将第二列转换为
float,从根源上保证数值类型正确; - 使用
pivot方法规范构建宽表,避免手动字典嵌套带来的类型问题; - 排序逻辑基于数值大小,缺失值(NaN)默认排在末尾,符合预期输出格式。
内容的提问来源于stack exchange,提问作者DarCoy
相关产品推荐
相关产品推荐

