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


Answers

你也可以做得更简洁:

df.sort_index(axis=1)

编辑

确保你保持价值

df = df.sort_index(axis=1)

或者做到位

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

Question

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

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

我需要重新排列列如下:

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

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




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

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

我在2.7.10中测试了它,它对我很有用。




最快的方法是:

df.sort_index(axis=1)

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

sortedDf=df.sort_index(axis=1)



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



一种用例是,您用某些前缀命名(某些)列,并且希望按照某些特定顺序(不按字母顺序排列)将这些前缀按列排序。

例如,您可能会使用Ft_开始所有功能,使用Lbl_等标签,并且首先需要所有前缀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)   ], [])  ]