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

pyt*_*ist 257 python dataframe pandas

我有一个dataframe超过200列.问题在于订单生成了

['Q1.3','Q6.1','Q1.2','Q1.1',......]
Run Code Online (Sandbox Code Playgroud)

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

['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
Run Code Online (Sandbox Code Playgroud)

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

Bre*_*arn 316

df = df.reindex(sorted(df.columns), axis=1)
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢这个,因为可以使用相同的方法对行进行排序(我需要对行和列进行排序).虽然它是相同的方法,你可以省略`axis`参数(或提供它的默认值,`0`),如`df.reindex_axis(sorted(non_sorted_row_index))`,它相当于`df.reindex(sorted(non_sorted_row_index) ))` (6认同)
  • 不推荐使用`reindex_axis`并导致`FutureWarning`.但是,`.reindex`工作正常.对于上面的例子,使用`df.reindex(columns = sorted(df.columns))` (6认同)
  • 请注意,重新索引不是就地完成的,因此要实际将排序应用于df,必须使用`df = df.reindex_axis(...)`.此外,请注意,使用此方法非字典排序很容易,因为列名称列表可以单独排序为任意顺序,然后传递给`reindex_axis`.使用@Wes McKinney建议的替代方法(`df = df.sort_index(axis = 1)`)无法实现这一点,但对于纯粹的词典编排类型而言,这种方法更为清晰. (2认同)
  • 这是一个很好的解决方案,但如果您有重复的列名,则不起作用。@Wes McKinney 的答案在这种情况下有效。因此,我认为“df.sort_index(axis=1)”是最合适的解决方案。 (2认同)

Wes*_*ney 294

你也可以做得更简洁:

df.sort_index(axis=1)
Run Code Online (Sandbox Code Playgroud)

确保将结果分配回来:

df = df.sort_index(axis=1)
Run Code Online (Sandbox Code Playgroud)

或者,就地执行:

df.sort_index(axis=1, inplace=True)
Run Code Online (Sandbox Code Playgroud)

  • 或者使用`df.sort_index(axis = 1,inplace = True)`来修改`df` (5认同)
  • 另外,“sort_index”比“reindex”更快,以防开发人员担心它 (3认同)
  • 这应该是公认的答案。 (3认同)
  • 记得按@multigoodverse做`df = df.sort_index(axis = 1)` (2认同)
  • 同意@rsmith54,因为此解决方案也适用于重复的列名。 (2认同)

Ive*_*lin 32

你可以这样做:

df[sorted(df.columns)]

编辑:更短的是

df[sorted(df)]
Run Code Online (Sandbox Code Playgroud)


小智 19

Tweet的答案可以传递给BrenBarn上面的回答

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)
Run Code Online (Sandbox Code Playgroud)

所以对于你的例子,说:

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)
Run Code Online (Sandbox Code Playgroud)

你得到:

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
Run Code Online (Sandbox Code Playgroud)

然后做:

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)
Run Code Online (Sandbox Code Playgroud)

导致:

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
Run Code Online (Sandbox Code Playgroud)


bur*_*res 15

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

df.sort_index(axis=1, inplace=True)
Run Code Online (Sandbox Code Playgroud)


小智 13

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

sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
your_dataframe = your_dataframe.reindex(columns=sequence)
Run Code Online (Sandbox Code Playgroud)

我在2.7.10中对此进行了测试,它对我有用.


Mye*_*Joo 11

对于多个列,您可以将列按顺序排列:

#['A', 'B', 'C'] <-this is your columns order
df = df[['C', 'B', 'A']]
Run Code Online (Sandbox Code Playgroud)

此示例显示了排序和切片列:

d = {'col1':[1, 2, 3], 'col2':[4, 5, 6], 'col3':[7, 8, 9], 'col4':[17, 18, 19]}
df = pandas.DataFrame(d)
Run Code Online (Sandbox Code Playgroud)

你得到:

col1  col2  col3  col4
 1     4     7    17
 2     5     8    18
 3     6     9    19
Run Code Online (Sandbox Code Playgroud)

然后做:

df = df[['col3', 'col2', 'col1']]
Run Code Online (Sandbox Code Playgroud)

导致:

col3  col2  col1
7     4     1
8     5     2
9     6     3     
Run Code Online (Sandbox Code Playgroud)