Re-ordering columns in pandas dataframe based on column name
我有一个
1 | ['Q1.3','Q6.1','Q1.2','Q1.1',......] |
我需要重新排序列,如下所示:
1 | ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......] |
在Python中有什么方法可以做到这一点吗?
1 | df = df.reindex(sorted(df.columns), axis=1) |
这假定对列名称进行排序将给出所需的顺序。如果您的列名不按字典顺序排序(例如,如果您希望Q10.3列出现在Q9.1之后),则需要按不同的顺序排序,但这与熊猫无关。
你也可以做得更简洁:
1 | df.sort_index(axis=1) |
确保将结果分配回:
1 | df = df.sort_index(axis=1) |
或者,在适当的地方:
1 | df.sort_index(axis=1, inplace=True) |
你只需做:
1 | df[sorted(df.columns)] |
编辑:较短的是
1 | df[sorted(df)] |
tweet的答案可以传给上面的Brenbarn的答案
1 | data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1) |
因此,对于您的示例,请说:
1 2 3 | 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) |
你得到:
1 2 3 4 5 6 7 8 | 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 |
然后这样做:
1 | data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1) |
导致:
1 2 3 4 5 6 7 8 9 | 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 |
不要忘记在WES的答案中添加"inplace=true",或者将结果设置为新的数据帧。
1 | df.sort_index(axis=1, inplace=True) |
如果需要任意序列而不是排序序列,可以执行以下操作:
1 2 | sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......] your_dataframe = your_dataframe.reindex(columns=sequence) |
我在2.7.10中测试过这个,它对我很有用。
对于多个列,可以按所需顺序排列列:
1 2 | #['A', 'B', 'C'] <-this is your columns order df = df[['C', 'B', 'A']] |
此示例显示排序和切片列:
1 2 | d = {'col1':[1, 2, 3], 'col2':[4, 5, 6], 'col3':[7, 8, 9], 'col4':[17, 18, 19]} df = pandas.DataFrame(d) |
你得到:
1 2 3 4 | col1 col2 col3 col4 1 4 7 17 2 5 8 18 3 6 9 19 |
然后这样做:
1 | df = df[['col3', 'col2', 'col1']] |
导致:
1 2 3 4 | col3 col2 col1 7 4 1 8 5 2 9 6 3 |
最快的方法是:
1 | df.sort_index(axis=1) |
请注意,这将创建一个新实例。因此,需要将结果存储在一个新变量中:
1 | sortedDf=df.sort_index(axis=1) |
一个用例是,您已经用一些前缀给列命名了(其中的一些),并且您希望用这些前缀对列进行全部排序,并以某种特定的顺序(不是按字母顺序)。
例如,您可以使用
1 2 | 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) ], []) ] |
1 2 3 | >>> ls = ['Q1.3', 'Q6.1', 'Q1.2'] >>> sorted(ls, key=lambda x: float(x[1:])) ['Q1.2', 'Q1.3', 'Q6.1'] |
1 | print df.sort_index(by='Frequency',ascending=False) |
其中,by是列的名称,如果要根据列对数据集排序