python-2.7 - 对包含字符串和数字的数据帧索引进行排序

标签 python-2.7 pandas dataframe

我有一个数据框,其中索引值是由下划线分隔的字符串和数字的混合。

    sub_int1_ICA_int2  # 

enter image description here

我想首先使用 int1 对列索引进行排序,然后使用 int2
预期输出将是:
    sub_1_ICA_1
    sub_1_ICA_2
    sub_1_ICA_3
    ...........
    sub_2_ICA_1
    sub_2_ICA_2
    ...........

正如我在许多帖子中看到的那样,我尝试使用 convert_numeric,但出现错误
     X.convert_objects(convert_numeric=True).sort_values(['id] , ascending=[True], inplace=True)
    >>(KeyError: 'id')

你能帮忙的话,我会很高兴!

最佳答案

使用 reindex 来自 sorted list通过自定义函数与 dictionary元组:

print (df)
              a
sub_1_ICA_0   4
sub_1_ICA_1   8
sub_1_ICA_10  7
sub_1_ICA_11  3
sub_1_ICA_12  2
sub_1_ICA_2   6
sub_1_ICA_3   6
sub_2_ICA_1   1
sub_2_ICA_2   3


a = df.index.tolist()
b = {}
for x in a:
    i = x.split('_')
    b[x] = ((int(i[1]), int(i[-1])))
print (b)
{'sub_1_ICA_10': (1, 10), 'sub_1_ICA_11': (1, 11), 
'sub_1_ICA_1': (1, 1), 'sub_2_ICA_2': (2, 2),
 'sub_1_ICA_0': (1, 0), 'sub_1_ICA_12': (1, 12), 
 'sub_1_ICA_3': (1, 3), 'sub_1_ICA_2': (1, 2),
 'sub_2_ICA_1': (2, 1)}

c = sorted(a, key=lambda x: b[x])
print (c)
['sub_1_ICA_0', 'sub_1_ICA_1', 'sub_1_ICA_2', 'sub_1_ICA_3', 
'sub_1_ICA_10', 'sub_1_ICA_11', 'sub_1_ICA_12', 'sub_2_ICA_1', 'sub_2_ICA_2']
df = df.reindex(c)
print (df)
              a
sub_1_ICA_0   4
sub_1_ICA_1   8
sub_1_ICA_2   6
sub_1_ICA_3   6
sub_1_ICA_10  7
sub_1_ICA_11  3
sub_1_ICA_12  2
sub_2_ICA_1   1
sub_2_ICA_2   3

另一个纯 Pandas 解决方案:
#create MultiIndex by split index, convert to DataFrame
df1 = df.index.str.split('_', expand=True).to_frame()
#set columns and index to original df
df1.columns = list('abcd')
df1.index = df.index
#convert columns to int and sort
df1[['b','d']] = df1[['b','d']].astype(int)
df1 = df1.sort_values(['b','d'])
print (df1)
                a  b    c   d
sub_1_ICA_0   sub  1  ICA   0
sub_1_ICA_1   sub  1  ICA   1
sub_1_ICA_2   sub  1  ICA   2
sub_1_ICA_3   sub  1  ICA   3
sub_1_ICA_10  sub  1  ICA  10
sub_1_ICA_11  sub  1  ICA  11
sub_1_ICA_12  sub  1  ICA  12
sub_2_ICA_1   sub  2  ICA   1
sub_2_ICA_2   sub  2  ICA   2

df = df.reindex(df1.index)
print (df)
              a
sub_1_ICA_0   4
sub_1_ICA_1   8
sub_1_ICA_2   6
sub_1_ICA_3   6
sub_1_ICA_10  7
sub_1_ICA_11  3
sub_1_ICA_12  2
sub_2_ICA_1   1
sub_2_ICA_2   3

最后一个版本是 natsort :
from natsort import natsorted

df = df.reindex(natsorted(df.index))
print (df)
              a
sub_1_ICA_0   4
sub_1_ICA_1   8
sub_1_ICA_2   6
sub_1_ICA_3   6
sub_1_ICA_10  7
sub_1_ICA_11  3
sub_1_ICA_12  2
sub_2_ICA_1   1
sub_2_ICA_2   3

编辑:

如果重复值,则通过拆分创建新列,转换为 int,排序并返回:
print (df)
              a
sub_1_ICA_0   4
sub_1_ICA_0   4
sub_1_ICA_1   8
sub_1_ICA_10  7
sub_1_ICA_11  3
sub_1_ICA_12  2
sub_1_ICA_2   6
sub_1_ICA_3   6
sub_2_ICA_1   1
sub_2_ICA_2   3

df.index = df.index.str.split('_', expand=True)
df = df.reset_index()
df[['level_1','level_3']] = df[['level_1','level_3']].astype(int)
df = df.sort_values(['level_1','level_3']).astype(str)

df = df.set_index(['level_0','level_1','level_2','level_3'])
df.index = df.index.map('_'.join)

print (df)

              a
sub_1_ICA_0   4
sub_1_ICA_0   4
sub_1_ICA_1   8
sub_1_ICA_2   6
sub_1_ICA_3   6
sub_1_ICA_10  7
sub_1_ICA_11  3
sub_1_ICA_12  2
sub_2_ICA_1   1
sub_2_ICA_2   3

关于python-2.7 - 对包含字符串和数字的数据帧索引进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47280920/

相关文章:

python - 使用日期时间索引转置数据框

python - 在pandas和matplotlib中,为什么不直接在数据帧上调用plt?

python - H2O 和 Pandas SparseDataFrame

python - Openerp create() 方法返回新的记录集 ID 但不更新数据库

python - 如何将字符串输入转换为包含整数和字符串的元组

python 基维 : unable to import main main

Python:将列单元格内的每个数组转换为单个字符串

python-2.7 - 类似于Matplotlib-Basemap的3D CartoPy

python - 根据列的最小值选择两列值

r - 为数据框中的因子添加额外的级别