熊猫订购专栏

时间:2018-08-01 11:36:34

标签: python regex string pandas sorting

我正在尝试按字母顺序对不同的列进行排序。 我使用了以下代码:

def CodeRegex (df):
    dfRegex = df.filter(regex="x[1-9][0-9]?|p")
    dfRegex = dfRegex.reindex_axis(sorted(dfRegex.columns), axis=1)
    return dfRegex

我的问题是我的标题看起来像“ x1”,“ x2,...,” x10,“ x11”,...,“ x20”,“ x21” ...

订购时,结果是: “ x1”,“ x10”,“ x11”,...,“ x2”,“ x20”,“ x21”,...

您知道我可以如何更改订单吗? 我不能放“ x01”,“ x02”。

谢谢!

2 个答案:

答案 0 :(得分:0)

您的列是字符串存在问题,因此按字典顺序进行了排序。

使用sortedlambda函数将列值转换为integerx[1:]用于从每个值中删除x,也应该有值p,因此可以选择是否需要排序列的第一个或最后一个值:

dfRegex = pd.DataFrame(columns=['x1', 'x10', 'x2', 'x20', 'x3','p'])

dfRegex = dfRegex.reindex(columns=sorted(dfRegex.columns, key=lambda x: int(x[1:]) if x!='p' else 0))
print (dfRegex)
Empty DataFrame
Columns: [p, x1, x2, x3, x10, x20]
Index: []

dfRegex = dfRegex.reindex(columns=sorted(dfRegex.columns, key=lambda x: int(x[1:]) if x!='p' else 100))
print (dfRegex)
Empty DataFrame
Columns: [x1, x2, x3, x10, x20, p]
Index: []

答案 1 :(得分:0)

排序失败的原因是因为列名是字符串,所以它们将作为字符串排序。因此,例如,'x20'将在之前 'x3'排序。

您可以通过提取整数部分进行数字排序。然后通过np.argsortpd.Dataframe.iloc进行索引:

import pandas as pd, numpy as np

df = pd.DataFrame(columns=['x1', 'x10', 'x2', 'x20', 'x3'])

args = np.argsort(df.columns.str[1:].astype(int))
df = df.iloc[:, args]

print(df.columns)

Index(['x1', 'x2', 'x3', 'x10', 'x20'], dtype='object')

numpy.argsort返回将对数组进行排序的原始pd.Index对象的索引:

print(args)

array([0, 2, 4, 1, 3], dtype=int64)