数据操作 - 当值为字母数字时对索引进行排序

时间:2017-11-11 16:06:53

标签: python pandas sorting dataframe indexing

我想知道如何处理这种数据操作困境。 在数据框中对多索引的索引进行排序的最佳方法是什么,其中索引的on级别的值是字母数字。 值为:

[u'0', u'1', u'10', u'11', u'2', u'2Y', u'3', u'3Y', u'4', u'4Y', u'5', u'5Y', u'6', u'7', u'8', u'9', u'9Y']

我搜索的结果是:

[u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'10', u'11', u'2Y', u'3Y', u'4Y', u'5Y', u'9Y']

普通数值代表数月,而整数加上' Y'多年来一直站着。

有没有办法对索引进行排序?

持续时间 - 是多指数的一个级别,第二个是总和。 请在下面找到示例数据集:

Duration                            2          2Y         3         3Y   
customer                                                                     
Invoice A                         25.50        0.00      0.00       20.00   
Invoice B                         50.00        25.00     -10.50     0.00
Invoice C                         125.00       0.00      11.20      0.50
Invoice D                         0.00        15.00      0.00       80.10

1 个答案:

答案 0 :(得分:2)

您可以使用natsort包自然对列进行排序。这是一个例子:

import natsort as ns

c =  ['0', '1', '10', ...]
c = sorted(ns.natsorted(c), key=lambda x: not x.isdigit())

print(c)
['0',
 '1',
 '2',
 '3',
 '4',
 '5',
 '6',
 '7',
 '8',
 '9',
 '10',
 '11',
 '2Y',
 '3Y',
 '4Y',
 '5Y',
 '9Y']

对于您的问题,采用类似的方法reindex_axis作为额外步骤:

c = df.columns.levels[1]
c = sorted(ns.natsorted(c), key=str.isdigit, reverse=True)

df = df.reindex_axis(pd.MultiIndex.from_product([df.columns.levels[0], c]), axis=1)