使用.sort_values()仅排序DataFrame指定列不影响其他列的问题
问题:仅排序DataFrame指定列,保留其他列原有顺序
问题描述
需要对DataFrame的Uno列单独排序,同时保持Dos和Tres列的原始数据顺序。尝试直接赋值排序后的Uno列未成功,但使用sort_values()对整个DataFrame排序(如示例中的df2)是正常的。
原代码:
import pandas as pd list_of_dicts_2 = {"Uno":[4,3,6,2,1,5], "Dos": [3,5,7,8,12,4],"Tres": [9,8,6,5,3,1]} df2= pd.DataFrame(list_of_dicts_2) print("SECOND DF") print(df2) df2= df2.sort_values(by = ["Uno"]) print(df2) #To do this, alterate the order of all columns. df3= pd.DataFrame(list_of_dicts_2) print("THIRD DF") print(df3) df3["Uno"]= df3["Uno"].sort_values() print(df3)
期望输出对应的DataFrame结构:
list_of_dicts_answer = {"Uno":[1,2,3,4,5,6], "Dos": [3,5,7,8,12,4],"Tres": [9,8,6,5,3,1]}
问题原因
直接使用df3["Uno"].sort_values()返回的是带原索引的排序后Series,赋值时Pandas会根据索引匹配到原DataFrame的对应行,而不是直接覆盖为排序后的顺序,导致最终Uno列的顺序不符合预期。
解决方案
提取排序后的Uno列的纯数值列表,再赋值给原列,这样就能忽略索引,直接替换成排序后的顺序:
import pandas as pd list_of_dicts_2 = {"Uno":[4,3,6,2,1,5], "Dos": [3,5,7,8,12,4],"Tres": [9,8,6,5,3,1]} df3 = pd.DataFrame(list_of_dicts_2) # 提取排序后的值列表进行赋值 df3["Uno"] = df3["Uno"].sort_values().tolist() # 或者用.values获取numpy数组再转列表 # df3["Uno"] = df3["Uno"].sort_values().values.tolist() print(df3)
运行后输出的df3就会符合期望:Uno列排序为[1,2,3,4,5,6],Dos和Tres列保持原始顺序不变。
内容的提问来源于stack exchange,提问作者Manuel Veiga
相关产品推荐
相关产品推荐

