You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于最后一列值对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)

说明

  1. 读取数据时直接将第二列转换为float,从根源上保证数值类型正确;
  2. 使用pivot方法规范构建宽表,避免手动字典嵌套带来的类型问题;
  3. 排序逻辑基于数值大小,缺失值(NaN)默认排在末尾,符合预期输出格式。

内容的提问来源于stack exchange,提问作者DarCoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:00:36