Skip to main content
 首页 » 编程设计

python之如何按最后一列对 NumPy 字符串数组进行排序

2025年05月04日13oomusou

有没有办法按最后一个元素对数组的行进行排序,在本例中是单元格 ID。小区 ID 构建如下:“CellID_NumberOfCell

arr =np.array([['65.0','30.0','20.0','0.0','0_0'], 
 ['2.0','29.0','24.0','0.0','1_0'], 
 ['0.0','18.0','4.0','0.0','2_0'], 
 ['16.0','9.0','0.0','9990.0','7_203'], 
 ['16.0','9.0','0.0','9990.0','0_203'], 
 ['20.0','23.0','31.0','9990.0','8_158'], 
 ['65.0','30.0','20.0','0.0','0_10']]) 

排序后应该是这样的:

arr =np.array([['65.0','30.0','20.0','0.0','0_0'], 
 ['65.0','30.0','20.0','0.0','0_10'], 
 ['16.0','9.0','0.0','9990.0','0_203'], 
 ['2.0','29.0','24.0','0.0','1_0'], 
 ['0.0','18.0','4.0','0.0','2_0'], 
 ['16.0','9.0','0.0','9990.0','7_203'], 
 ['20.0','23.0','31.0','9990.0','8_158']]) 

编辑:

排序后是否也可以删除下划线后面的数字?。所以我只有身份证。而不是 0_0 只是 0。

EDIT2

ID排序后,还要按时间排序,比如每个ID为0的也应该按时间0,1...9999等排序

请您参考如下方法:

np.argsort(arr[:, -1]) 将为您提供排列,以便对 arr 最后一列的元素进行排序。

然后,arr[np.argsort(arr[:, -1])] 根据此排列对 arr 的行重新排序。

请注意,由于您的数据由字符串组成,因此使用了字典顺序,因此 0_10 出现在 0_2 之前。如果这不是您想要的,您应该拆分最后一列,我建议您使用 pandas.DataFrame:

import pandas as pd 
df = pd.DataFrame(arr) 
df['Cell'], df['CellIndex'] = df[df.columns[-1]].str.split('_', 1).str 
df['Cell'] = df['Cell'].astype(int) 
df['CellIndex'] = df['CellIndex'].astype(int) 
df.sort_values(['Cell', 'CellIndex']) 

pandas 是处理此类数据的真正方式。