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

为何pandas的sort_values未正常工作?排序后数据输出异常

解决pandas DataFrame排序后值异常的问题

你遇到的这个排序后所有percentuali值都相同、排序未生效的问题,根源确实是两处代码逻辑错误,我来帮你拆解并修正:

错误1:赋值时覆盖整列而非单行

你在循环里给percentuali列赋值时,应该是用了类似target_playlist['percentuali'] = p[i][1]的写法——这会把整个列的所有行都设置为当前循环的p[i][1],循环结束后,整列自然都变成最后一次循环的p[i][1]值(也就是你看到的0.7559795411177228)。

正确做法:要给单行赋值,得指定对应的行位置或索引,比如用iloc定位第i行:

# 按循环的位置顺序逐行赋值
target_playlist.iloc[i, target_playlist.columns.get_loc('percentuali')] = p[i][1]
# 或者用loc结合索引(如果DataFrame的索引是连续的)
target_playlist.loc[i, 'percentuali'] = p[i][1]

错误2:排序后用原索引循环访问

排序后target_playlist的行顺序已经改变,但你还是用原pred数组的循环索引i去访问DataFrame,这时候原索引和排序后的数据行已经不匹配了,自然取不到正确的排序后数值。

正确做法:排序后直接遍历DataFrame的行,或者用排序后的位置索引来访问:

# 方式1:更直观的逐行遍历(推荐)
for idx, row in target_playlist.iterrows():
    print(f"Probabilita值:{row['percentuali']}")

# 方式2:按位置索引遍历
for i in range(len(target_playlist)):
    print(target_playlist.iloc[i]['percentuali'])

完整修正示例代码

import pandas as pd

# 假设pred是你的原始数据数组
pred = [("item1", 0.2), ("item2", 0.8), ("item3", 0.5)]

# 初始化DataFrame(示例结构)
target_playlist = pd.DataFrame({"item": [p[0] for p in pred]})
target_playlist['percentuali'] = 0.0  # 先初始化percentuali列

# 正确赋值:逐行设置percentuali值
for i in range(len(pred)):
    target_playlist.iloc[i, target_playlist.columns.get_loc('percentuali')] = pred[i][1]

# 执行降序排序
target_playlist.sort_values('percentuali', inplace=True, ascending=False)

# 正确遍历排序后的结果
print("排序后的Probabilita值:")
for idx, row in target_playlist.iterrows():
    print(f"{row['item']}: {row['percentuali']}")

这样修改后,排序就能正常生效,遍历也能拿到正确的排序后数值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:37:34