Python Pandas – 根据列名重新排列数据框中的列

我有一个超过200列的dataframe (不要问为什么)。 问题是因为他们生成的顺序是

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

我需要重新排列列如下:

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

有没有办法让我在Python中做到这一点?

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

这假定对列名进行sorting会给你想要的订单。 如果你的列名不按照字典顺序排列(例如,如果你想在Q9.1之后出现Q10.3的列),你需要以不同的方式sorting,但这与pandas没有任何关系。

你也可以做得更简洁:

df.sort_index(axis=1)

编辑

确保你保持价值

df = df.sort_index(axis=1)

或者做到位

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

你可以做:

 DF [sorting(df.columns)]

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 

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

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

如果你需要一个任意的序列而不是有序的序列,你可以这样做:

 sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......] your_dataframe = your_dataframe.reindex(columns=sequence) 

我在2.7.10中testing了它,它为我工作。

对于几列,你可以把列顺序你想要的:

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

这个例子显示了sorting和切片的列:

 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 

最快的方法是:

 df.sort_index(axis=1) 

请注意,这会创build一个新的实例。 因此,您需要将结果存储在一个新的variables中:

 sortedDf=df.sort_index(axis=1) 

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

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

一个用例是,您已经用某些前缀命名(某些)列,并且希望按照某些特定顺序(不按字母顺序)将这些前缀sorting在一起。

例如,您可能会使用Ft_Lbl_等标签来启动所有function,并且首先需要所有前缀Lbl_列,然后是所有function,然后是标签。 你可以用下面的函数做这个(我会注意到一个可能的效率问题,使用sum来减less列表,但这不是一个问题,除非你有很多的列,我不这样做):

 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) ], []) ] 
 print df.sort_index(by='Frequency',ascending=False) 

其中by是列的名称,如果您想根据列对数据集进行sorting