关于python:根据列名重新排序pandas数据帧中的列

Re-ordering columns in pandas dataframe based on column name

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

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)

一个用例是,您已经用一些前缀给列命名了(其中的一些),并且您希望用这些前缀对列进行全部排序,并以某种特定的顺序(不是按字母顺序)。

例如,您可以使用Ft_开始所有功能,使用Lbl_等标记,并且您希望首先使用所有未固定的列,然后是所有功能,然后是标签。您可以使用以下功能来完成此操作(我将注意到使用sum来减少列表可能存在效率问题,但这不是问题,除非您有许多列,而我没有这些列):

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

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

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是列的名称,如果要根据列对数据集排序