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

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

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

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

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


当前回答

print df.sort_index(by='Frequency',ascending=False)

如果要根据列对数据集进行排序,by是列的名称

其他回答

你也可以做得更简洁:

df.sort_index(axis=1)

确保你把结果赋值回去:

df = df.sort_index(axis=1)

或者,就地做:

df.sort_index(axis=1, inplace=True)
df = df.reindex(sorted(df.columns), axis=1)

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

对于几个列,你可以按你想要的顺序排列:

#['A', 'B', 'C'] <-this is your columns order
df = df[['C', 'B', 'A']]

这个例子展示了对列进行排序和切片:

d = {'col1':[1, 2, 3], 'col2':[4, 5, 6], 'col3':[7, 8, 9], 'col4':[17, 18, 19]}
df = pandas.DataFrame(d)

你会得到:

col1  col2  col3  col4
 1     4     7    17
 2     5     8    18
 3     6     9    19

然后做:

df = df[['col3', 'col2', 'col1']]

导致:

col3  col2  col1
7     4     1
8     5     2
9     6     3     

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

最快的方法是:

df.sort_index(axis=1)

请注意,这会创建一个新实例。因此,你需要将结果存储在一个新变量中:

sortedDf=df.sort_index(axis=1)