数据帧索引中混合整数和字符串的自定义排序

时间:2018-03-13 22:24:21

标签: python html pandas datatables

我有一个Panda的Dataframe,我需要以特定的方式重新索引。有几个编号的索引,但最后一个是字符串。如果不包含字符串,索引按数字顺序排列,1-20就好了。

但是,只要我包含字符串索引,该顺序就会切换为字母数字(1,11,12 ... 18,19,2,20,3,4等)。有没有办法我可以正确地数字组织列表,然后添加字符串索引而不改变列表的组织方式?

[编辑]:

我自己意识到了这个缺点。我以为我已经包含了数据框在构建后被转换为html安全表( DataTable )并显示在网页上。这可能会导致我遇到的问题,但欢迎任何有关此问题的见解。

我正在查看的数据框架的一个示例:

          Column 1
0       Value 1
1       Value 2
2       Value 3
3       Value 4
    ...
18      Value 19
19      Value 20
string  Value 21

2 个答案:

答案 0 :(得分:0)

这些方面应该有效:

new_index = list(df.index)

new_index[-1] = 'string'

df.index=new_index

例如:

df=pd.DataFrame(np.random.random(5))

>>> df
          0
0  0.665922
1  0.591298
2  0.274722
3  0.561243
4  0.382927

new_index = list(df.index)

new_index[-1] = 'string'

df.index=new_index

返回重新索引的df:

>>> df
           0
0       0.665922
1       0.591298
2       0.274722
3       0.561243
string  0.382927

答案 1 :(得分:0)

这是一种方法。您可以分离数字和非数字索引并单独对它们进行排序。

df = pd.DataFrame({1: ['Val1', 'Val2', 'Val3', 'Val4', 'Val5']},
                  index=['0', '1', '11', '2', 'string'])

order1 = sorted((x for x in df.index if x.isdigit()), key=lambda i: int(i))
order2 = sorted(x for x in df.index if not x.isdigit())

df = df.loc[order1+order2]

#            1
# 0       Val1
# 1       Val2
# 2       Val3
# 11      Val4
# string  Val5