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)
问题原因
axis与by参数混淆:sort_values中,axis=1表示按列排序,此时by指定的是行索引标签而非列名。原new_df的行索引包含标签1,所以能正常运行;若实际需求是按列值排序,需将axis设为0。- 切片逻辑误解:
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
相关产品推荐
相关产品推荐

