【问题标题】:Pandas Ordering columns in orderPandas 按顺序排列列
【发布时间】: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”。

谢谢!

【问题讨论】:

    标签: python regex string pandas sorting


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 2014-11-29
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多