关于Pandas.sort_values多列排序逻辑的疑问及代码验证
Pandas
sort_values多列排序逻辑解析 为什么你的两次排序结果一致
你的数据里col1的所有非空值都是唯一的(A、Z、E、D、C、B无重复),NaN单独成组。这种情况下,第一列已经完全确定了整个DataFrame的排序顺序,后续的col2、col3没有发挥作用的空间——因为没有重复的col1值需要进一步用其他列区分排序。
Pandas多列排序的真实逻辑
sort_values的多列排序是层级优先级排序,绝非各列独立排序,具体逻辑:
- 先按
by参数的第一列排序,将数据按列值分成若干分组 - 对每个分组内部,再按第二列排序
- 若有更多列,重复上述步骤:在已排好的子分组内,继续按下一列细化排序
举个修改后的示例,让col1出现重复值,就能看到差异:
import pandas as pd import numpy as np df = pd.DataFrame({ 'col1' : ['A', 'Z', 'E', np.nan, 'A', 'C','B'], # 将原'D'改为'A',制造重复项 'col2' : [2, 1, 9, 8, 7, 4,10], 'col3': [0, 1, 9, 4, 2, 3,1], 'col4': [11,12,12,13,14,55,56], }) df_sort1= df.sort_values(by=['col1', 'col2','col3']) df_sort2= df.sort_values(by=['col1'])
此时df_sort1中col1为A的两行会按col2的大小(2 < 7)排序,而df_sort2里这两行会保留原始数据的相对顺序,两者结果完全不同。
你的理解误区
你之前误以为多列排序是各列独立排序后再合并,但实际是递进式分组排序:只有当前一列存在重复值时,后续列才会影响排序结果;如果前一列所有值唯一,后面的列不会改变最终顺序。
补充:默认情况下,相同值的行会保留原始DataFrame中的相对顺序(稳定排序),除非指定kind='quicksort'(非稳定)或ignore_index=True重置索引。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

