我有一个超过200列的数据框架。问题是它们生成的顺序是

['Q1.3','Q6.1','Q1.2','Q1.1',......]

我需要对列进行排序如下:

['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]

在Python中有什么方法可以做到这一点吗?


当前回答

不要忘记在Wes的答案中添加“inplace=True”,或者将结果设置为新的DataFrame。

df.sort_index(axis=1, inplace=True)

其他回答

df = df.reindex(sorted(df.columns), axis=1)

这假设对列名进行排序将得到您想要的顺序。如果您的列名不是按字典顺序排序的(例如,如果您希望Q10.3列出现在Q9.1之后),则需要以不同的方式排序,但这与pandas无关。

sort方法和sorted函数允许你提供一个自定义函数来提取用于比较的键:

>>> ls = ['Q1.3', 'Q6.1', 'Q1.2']
>>> sorted(ls, key=lambda x: float(x[1:]))
['Q1.2', 'Q1.3', 'Q6.1']

一个用例是,您已经用某个前缀命名了(一些)列,并且您希望这些列都用这些前缀排序,并以某种特定的顺序(不是字母顺序)排序。

例如,你可以用Ft_开头所有的特征,用Lbl_开头标签,等等,你想要所有无前缀的列,然后是所有特征,然后是标签。你可以用下面的函数来做到这一点(我会注意到使用sum来减少列表可能存在的效率问题,但这不是一个问题,除非你有很多列,而我没有):

def sortedcols(df, groups = ['Ft_', 'Lbl_'] ):
    return df[ sum([list(filter(re.compile(r).search, list(df.columns).copy())) for r in (lambda l: ['^(?!(%s))' % '|'.join(l)] + ['^%s' % i  for i in l ] )(groups)   ], [])  ]

你也可以做得更简洁:

df.sort_index(axis=1)

确保你把结果赋值回去:

df = df.sort_index(axis=1)

或者,就地做:

df.sort_index(axis=1, inplace=True)

Tweet的答案可以传递到BrenBarn的答案上面

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)

举个例子,你可以说:

vals = randint(low=16, high=80, size=25).reshape(5,5)
cols = ['Q1.3', 'Q6.1', 'Q1.2', 'Q9.1', 'Q10.2']
data = DataFrame(vals, columns = cols)

你会得到:

data

    Q1.3    Q6.1    Q1.2    Q9.1    Q10.2
0   73      29      63      51      72
1   61      29      32      68      57
2   36      49      76      18      37
3   63      61      51      30      31
4   36      66      71      24      77

然后做:

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)

导致:

data


     Q1.2    Q1.3    Q6.1    Q9.1    Q10.2
0    2       0       1       3       4
1    7       5       6       8       9
2    2       0       1       3       4
3    2       0       1       3       4
4    2       0       1       3       4