我正在尝试按字母顺序对不同的列进行排序。 我使用了以下代码:
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”。
谢谢!
答案 0 :(得分:0)
您的列是字符串存在问题,因此按字典顺序进行了排序。
使用sorted
和lambda
函数将列值转换为integer
。 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: []
答案 1 :(得分:0)
排序失败的原因是因为列名是字符串,所以它们将作为字符串排序。因此,例如,'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)