数据操作 - 值是字母数字时的排序索引

Posted

技术标签:

【中文标题】数据操作 - 值是字母数字时的排序索引【英文标题】:Data Manipulation - Sort Index when values are Alphanumeric 【发布时间】:2018-04-24 16:42:33 【问题描述】:

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

[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 - 一级是多指标,二级是总和。 请在下面找到一个示例数据集:

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

【问题讨论】:

你要排序0级还是1级? 第一个在我的情况下是持续时间 【参考方案1】:

您可以使用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)

【讨论】:

这是我在代码c = sorted(ns.natsorted(df_with_col_arg), key=lambda x: not x.isdigit()) AttributeError: 'tuple' object has no attribute 'isdigit'看到的错误 @OAK c = df.columns.levels[0] 你可以试试这个吗? @COLDSPEED 我写错了。现在更正它,但现在这条线df = df.reindex_axis(c, axis=1) 显示TypeError: Expected tuple, got str。其中 C 是列表类型。尝试将 C 转换为元组,但返回相同的错误。 @OAK 您可以打印df.columns 并将结果添加到您的问题中吗?这会有所帮助。 @COLDSPEED - 非常感谢!效果很好,很棒!

以上是关于数据操作 - 值是字母数字时的排序索引的主要内容,如果未能解决你的问题,请参考以下文章

数据库操作时的临时文件

基数排序(数字排序和英文字母排序)

linq 字母数字组合字符串排序

mysql创建索引的原则

mybatis排序

大数据排序问题