为何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
相关产品推荐
相关产品推荐

