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
函数将列值转换为integer
s。 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中的DataFrame按指定顺序输出所有列的方法