数据操作 - 值是字母数字时的排序索引
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 - 非常感谢!效果很好,很棒!以上是关于数据操作 - 值是字母数字时的排序索引的主要内容,如果未能解决你的问题,请参考以下文章