Pandas 按顺序排列列

Posted

技术标签:

【中文标题】Pandas 按顺序排列列【英文标题】:Pandas Ordering columns in order 【发布时间】:2019-01-08 23:10:10 【问题描述】:

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

使用sorted by lambda 函数将列值转换为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: []

【讨论】:

您还可以评论为什么 OP 会看到当前行为,即因为那些 x123 列名按文本排序,而不是数字。 非常感谢!【参考方案2】:

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

您可以通过提取整数分量来进行数字排序。然后通过np.argsort 使用pd.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)

【讨论】:

以上是关于Pandas 按顺序排列列的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 数据框按时间顺序转换日期

excel中一列数据自动按顺序排列出来函数

dplyr:在 R 中按字母顺序排列列

Pandas中的DataFrame按指定顺序输出所有列的方法

Mysql中ORDER BY 排序怎么使用?指定顺序和多字段排列

如何对EXCEL列进行指定顺序排列?