Pandas在ord中订购列

2024-07-04 07:53:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着按字母顺序排列不同的栏目。 我使用了以下代码:

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”。在

谢谢你!在


Tags: 代码dfdef字母filterx1x2x10
2条回答

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

您可以通过提取整数分量进行数字排序。然后通过np.argsort^{}索引:

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')

^{}返回将对数组排序的原始pd.Index对象的索引:

^{pr2}$

有一个问题,你的列是字符串,所以有字典排序。在

使用sortedbylambda函数,将列值转换为integers。x[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: []

相关问题 更多 >

    热门问题