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

Pandas DataFrame整体排序正常,子集调用sort_values失效问题咨询

DataFrame子集排序异常问题

完整代码

import pandas as pd
data = [[1, 1, 2, 1, 0], [ 2, 2, 2, 1, 4], [ 3, 1, 0, 1,4], [ 4, 1, 3, 1, 4], 
        [5, 1, 6, 1, 4], [ 6, 1, 2, 0, 4], [ 7, 1, 2, 7,4], [ 8, 1, 2, 1, 1], 
        [9, 1, 2, 1, 2], [10, 1, 2, 1, 3], [11, 1, 2, 1,5], [12, 1, 2, 1, 6]]
df = pd.DataFrame(data, columns=['Id','c1', 'c2','c3', 'c4'])

import scipy.integrate
import scipy.special
mat = scipy.spatial.distance.cdist(
    df[['c1','c2','c3','c4']], 
    df[['c1','c2','c3','c4']], 
    metric='euclidean'
)
new_df = pd.DataFrame(mat, index=df['Id'], columns=df['Id']) 

正常运行的排序代码

直接对整个DataFrame按行1的值排序列:

new_df.sort_values(by=1,ascending=True,kind="mergesort",axis=1)

出现问题的子集排序代码

取行子集后执行排序失败:

i = 1
j = 2
new_dff = new_df[i:j]
new_dff.sort_values(by=1, ascending=True, kind="mergesort", axis=1)

问题原因

  1. axis与by参数混淆:sort_values中,axis=1表示按列排序,此时by指定的是行索引标签而非列名。原new_df的行索引包含标签1,所以能正常运行;若实际需求是按列值排序,需将axis设为0。
  2. 切片逻辑误解:new_df[i:j]是对行进行标签范围切片(包含标签1,不包含标签2),如果目标是取列子集,应该用new_df.loc[:, i:j]。

修正方案

场景1:对行子集的列按行值排序

若确实需要对行子集的列按行1的值排序,注意sort_values默认返回新对象,若要修改原数据需加inplace=True:

i = 1
j = 2
new_dff = new_df[i:j]
# 方式1:赋值给新变量
sorted_result = new_dff.sort_values(by=1, ascending=True, kind="mergesort", axis=1)
# 方式2:原地修改
new_dff.sort_values(by=1, ascending=True, kind="mergesort", axis=1, inplace=True)

场景2:对列子集按列值排序

若需求是取列子集后按列1的值对行排序,调整axis为0(默认值可省略):

i = 1
j = 2
# 取列1到列2的子集
new_dff = new_df.loc[:, i:j]
# 按列1的值排序行
new_dff.sort_values(by=1, ascending=True, kind="mergesort")

关键提示

  • 标签索引的DataFrame中,df[a:b]仅作用于行,取列子集必须用loc[:, a:b](按标签)或iloc[:, a:b](按位置);
  • sort_values的by参数含义由axis决定:axis=0对应列名,axis=1对应行标签。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:48:25