根据列名重新排序pandas数据帧中的列

时间:2012-06-16 21:05:01

标签: python pandas dataframe

我有dataframe超过200列。问题是,他们生成的订单是

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

我需要按如下方式重新排序列:

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

我有什么方法可以在Python中执行此操作吗?

11 个答案:

答案 0 :(得分:274)

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

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

答案 1 :(得分:263)

你也可以做得更简洁:

df.sort_index(axis=1)

确保将结果分配回来:

df = df.sort_index(axis=1)

或者,就地进行:

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

答案 2 :(得分:26)

你可以这样做:

df[sorted(df.columns)]

编辑:缩短

df[sorted(df)]

答案 3 :(得分:17)

Tweet's answer可以通过

传递给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

答案 4 :(得分:15)

别忘了添加" inplace = True"对Wes'回答或将结果设置为新的DataFrame。

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

答案 5 :(得分:12)

如果您需要任意序列而不是排序序列,您可以这样做:

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

我在2.7.10中对此进行了测试,这对我有用。

答案 6 :(得分:9)

对于多个列,您可以根据需要添加列:

#['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     

答案 7 :(得分:3)

最快的方法是:

df.sort_index(axis=1)

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

sortedDf=df.sort_index(axis=1)

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

一个用例是你用一些前缀命名(某些)你的列,并且你希望用这些前缀排序的列全部在一起并以某种特定的顺序排序(不是按字母顺序排列)。

例如,您可以使用Ft_,带有Lbl_的标签等启动所有功能,并且首先需要所有未加前缀的列,然后是所有功能,然后是标签。您可以使用以下函数执行此操作(我将使用sum注意可能的效率问题以减少列表,但这不是问题,除非您有很多列,我不这样做:< / p>

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)   ], [])  ]

答案 10 :(得分:-2)

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

其中by是列的名称,如果要根据列

对数据集进行排序