如何更改DataFrame列的顺序?

Tim*_*mie 729 python dataframe pandas

我有以下DataFrame(df):

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5))
Run Code Online (Sandbox Code Playgroud)

我通过赋值添加更多列:

df['mean'] = df.mean(1)
Run Code Online (Sandbox Code Playgroud)

如何将列移动mean到前面,即将其设置为第一列,使其他列的顺序保持不变?

Ama*_*man 740

一种简单的方法是使用列表重新分配数据框,根据需要重新排列.

这就是你现在拥有的:

In [6]: df
Out[6]:
          0         1         2         3         4      mean
0  0.445598  0.173835  0.343415  0.682252  0.582616  0.445543
1  0.881592  0.696942  0.702232  0.696724  0.373551  0.670208
2  0.662527  0.955193  0.131016  0.609548  0.804694  0.632596
3  0.260919  0.783467  0.593433  0.033426  0.512019  0.436653
4  0.131842  0.799367  0.182828  0.683330  0.019485  0.363371
5  0.498784  0.873495  0.383811  0.699289  0.480447  0.587165
6  0.388771  0.395757  0.745237  0.628406  0.784473  0.588529
7  0.147986  0.459451  0.310961  0.706435  0.100914  0.345149
8  0.394947  0.863494  0.585030  0.565944  0.356561  0.553195
9  0.689260  0.865243  0.136481  0.386582  0.730399  0.561593

In [7]: cols = df.columns.tolist()

In [8]: cols
Out[8]: [0L, 1L, 2L, 3L, 4L, 'mean']
Run Code Online (Sandbox Code Playgroud)

cols以您想要的任何方式重新排列.这就是我将最后一个元素移动到第一个位置的方式:

In [12]: cols = cols[-1:] + cols[:-1]

In [13]: cols
Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]
Run Code Online (Sandbox Code Playgroud)

然后重新排序数据帧,如下所示:

In [16]: df = df[cols]  #    OR    df = df.ix[:, cols]

In [17]: df
Out[17]:
       mean         0         1         2         3         4
0  0.445543  0.445598  0.173835  0.343415  0.682252  0.582616
1  0.670208  0.881592  0.696942  0.702232  0.696724  0.373551
2  0.632596  0.662527  0.955193  0.131016  0.609548  0.804694
3  0.436653  0.260919  0.783467  0.593433  0.033426  0.512019
4  0.363371  0.131842  0.799367  0.182828  0.683330  0.019485
5  0.587165  0.498784  0.873495  0.383811  0.699289  0.480447
6  0.588529  0.388771  0.395757  0.745237  0.628406  0.784473
7  0.345149  0.147986  0.459451  0.310961  0.706435  0.100914
8  0.553195  0.394947  0.863494  0.585030  0.565944  0.356561
9  0.561593  0.689260  0.865243  0.136481  0.386582  0.730399
Run Code Online (Sandbox Code Playgroud)

  • 你得到"无法连接'str'和'list'对象"确保你[] cols中的str值:cols = [cols [7]] + cols [:7] + cols [8:] (14认同)
  • 这意味着复制所有数据,这是非常低效的.我希望大熊猫能够在不创建副本的情况下做到这一点. (7认同)
  • @FooBar这不是一个集合联盟,它是两个有序列表的串联. (3认同)
  • @Aman我只是指出你的代码已被弃用.您对邮件的处理由您自行决定. (3认同)
  • @FooBar,`cols`的类型是`list`; 它甚至允许重复(在数据帧上使用时将被丢弃).你在考虑`Index`对象. (2认同)

小智 366

你也可以这样做:

df = df[['mean', '0', '1', '2', '3']]
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令获取列列表:

cols = list(df.columns.values)
Run Code Online (Sandbox Code Playgroud)

输出将产生:

['0', '1', '2', '3', 'mean']
Run Code Online (Sandbox Code Playgroud)

...然后在将其放入第一个函数之前,可以手动重新排列

  • 您还可以使用list(df.columns)获取列的列表 (6认同)
  • 或``df.columns.tolist()` (4认同)
  • 我认为这不是一个好的答案,因为它没有提供如何更改任何数据帧的列顺序的代码。假设我将 csv 文件导入为 pandas pd as ```pd.read_csv()``` 。您的答案如何用于更改列顺序? (4认同)
  • @Robvh,第二行代码解释了如何获取现有的列名称。从那里,您可以将输出复制到第一行代码中,并根据需要重新排列。唯一需要了解的其他信息是,如果没有标题,默认列名称是整数,而不是字符串。 (2认同)

fix*_*xer 292

只需按照您想要的顺序分配列名称:

In [39]: df
Out[39]: 
          0         1         2         3         4  mean
0  0.172742  0.915661  0.043387  0.712833  0.190717     1
1  0.128186  0.424771  0.590779  0.771080  0.617472     1
2  0.125709  0.085894  0.989798  0.829491  0.155563     1
3  0.742578  0.104061  0.299708  0.616751  0.951802     1
4  0.721118  0.528156  0.421360  0.105886  0.322311     1
5  0.900878  0.082047  0.224656  0.195162  0.736652     1
6  0.897832  0.558108  0.318016  0.586563  0.507564     1
7  0.027178  0.375183  0.930248  0.921786  0.337060     1
8  0.763028  0.182905  0.931756  0.110675  0.423398     1
9  0.848996  0.310562  0.140873  0.304561  0.417808     1

In [40]: df = df[['mean', 4,3,2,1]]
Run Code Online (Sandbox Code Playgroud)

现在,'mean'专栏出现在前面:

In [41]: df
Out[41]: 
   mean         4         3         2         1
0     1  0.190717  0.712833  0.043387  0.915661
1     1  0.617472  0.771080  0.590779  0.424771
2     1  0.155563  0.829491  0.989798  0.085894
3     1  0.951802  0.616751  0.299708  0.104061
4     1  0.322311  0.105886  0.421360  0.528156
5     1  0.736652  0.195162  0.224656  0.082047
6     1  0.507564  0.586563  0.318016  0.558108
7     1  0.337060  0.921786  0.930248  0.375183
8     1  0.423398  0.110675  0.931756  0.182905
9     1  0.417808  0.304561  0.140873  0.310562
Run Code Online (Sandbox Code Playgroud)

  • @NicholasMorley - 如果您的df中有1000列,这不是最好的答案. (17认同)
  • 这是少数列的最佳答案. (5认同)
  • 它是否复制? (4认同)
  • 您似乎不像您最初声称的那样分配给 `<df>.columns` (2认同)
  • 这只是@freddygv先前答案的一个副本。那应该是公认的答案,而不是这个。 (2认同)

Wes*_*ney 115

怎么样:

df.insert(0, 'mean', df.mean(1))
Run Code Online (Sandbox Code Playgroud)

http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion

  • 这可能是未来的功能添加到"熊猫"吗?像`df.move(0,df.mean)`这样的东西? (30认同)
  • 这适用于OP的问题,在创建新列时,但不适用于移动列;尝试移动“*** ValueError:无法插入平均值,已存在”的结果 (6认同)
  • 美丽的。它也发生在原地。 (5认同)
  • 这是一个干净的解决方案。现代 API 方法是: [`df.insert(0, 'mean', df['mean'])`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas. DataFrame.insert.html?highlight=pandas%20insert#pandas.DataFrame.insert) (5认同)
  • 对于最新的 pandas 版本,如果该列已经存在,它会抛出错误。但是,有一个非常简单的解决方案: df.insert(0, "mean", df.pop("mean")) 只需“弹出”同一列。 (5认同)
  • 这是一个可扩展的解决方案,因为其他解决方案需要手动输入列名称。 (3认同)
  • @spinup如果您已经拥有该列,则可以在不同的临时名称下插入,删除原始列,然后将临时名称返回到原始列: `df.insert(0, 'mean_temp', df['mean']) df.insert(0, 'mean_temp', df['mean']) df. drop('mean', axis=1, inplace=True) df.rename(columns={'mean_temp': 'mean'}, inplace=True)` (3认同)
  • 这太耸人听闻了。 (2认同)

Alv*_*oao 109

在你的情况下,

df = df.reindex(columns=['mean',0,1,2,3,4])
Run Code Online (Sandbox Code Playgroud)

会做你想要的.

在我的情况下(一般形式):

df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))
Run Code Online (Sandbox Code Playgroud)

更新2018年1月

如果你想使用__CODE__:

df = df.reindex(columns=['mean',0,1,2,3,4])
Run Code Online (Sandbox Code Playgroud)

  • 我尝试设置 `copy=False`,但看起来 `reindex_axis` 仍然创建了一个副本。 (2认同)

lia*_*gli 55

假设你有dfA B C

最简单的方法是:

df = df.reindex(['B','C','A'], axis=1)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这只会返回重新索引的数据帧 - 不会更改正在使用的“df”实例。如果要使用重新索引的 df,只需使用返回值:`df2 = df.reindex(['B', 'C', 'A'], axis=1)`。感谢您的回答! (3认同)

Yuc*_*uca 39

从2018年8月起:

如果列名太长而无法输入,则可以通过具有以下位置的整数列表指定新订单:

          0         1         2         3         4      mean
0  0.397312  0.361846  0.719802  0.575223  0.449205  0.500678
1  0.287256  0.522337  0.992154  0.584221  0.042739  0.485741
2  0.884812  0.464172  0.149296  0.167698  0.793634  0.491923
3  0.656891  0.500179  0.046006  0.862769  0.651065  0.543382
4  0.673702  0.223489  0.438760  0.468954  0.308509  0.422683
5  0.764020  0.093050  0.100932  0.572475  0.416471  0.389390
6  0.259181  0.248186  0.626101  0.556980  0.559413  0.449972
7  0.400591  0.075461  0.096072  0.308755  0.157078  0.207592
8  0.639745  0.368987  0.340573  0.997547  0.011892  0.471749
9  0.050582  0.714160  0.168839  0.899230  0.359690  0.438500
Run Code Online (Sandbox Code Playgroud)

对于OP问题的具体情况:

new_order = [3,2,1,4,5,0]
print(df[df.columns[new_order]])  

          3         2         1         4      mean         0
0  0.575223  0.719802  0.361846  0.449205  0.500678  0.397312
1  0.584221  0.992154  0.522337  0.042739  0.485741  0.287256
2  0.167698  0.149296  0.464172  0.793634  0.491923  0.884812
3  0.862769  0.046006  0.500179  0.651065  0.543382  0.656891
4  0.468954  0.438760  0.223489  0.308509  0.422683  0.673702
5  0.572475  0.100932  0.093050  0.416471  0.389390  0.764020
6  0.556980  0.626101  0.248186  0.559413  0.449972  0.259181
7  0.308755  0.096072  0.075461  0.157078  0.207592  0.400591
8  0.997547  0.340573  0.368987  0.011892  0.471749  0.639745
9  0.899230  0.168839  0.714160  0.359690  0.438500  0.050582
Run Code Online (Sandbox Code Playgroud)

这种方法的主要问题是多次调用相同的代码会每次都产生不同的结果,所以需要小心:)


dmv*_*nna 35

这个问题之前已经回答过,reindex_axis现在已弃用,所以我建议使用:

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

对于那些想要指定他们想要的顺序而不只是排序的人,这里是详细说明的解决方案:

df = df.reindex(['the','order','you','want'], axis=1)
Run Code Online (Sandbox Code Playgroud)

现在,您希望如何对列名列表进行排序实际上不是一个pandas问题,而是一个 Python 列表操作问题。有很多方法可以做到这一点,我认为这个答案有一种非常巧妙的方法。

  • 不,那不一样。在那里用户想要按名称对所有列进行排序。在这里,他们希望将一列移动到第一列,同时保持其他列的顺序不变。 (21认同)
  • 如果您不希望它们排序怎么办? (2认同)

Ale*_*der 31

您需要按所需顺序创建列的新列表,然后使用df = df[cols]此新顺序重新排列列.

cols = ['mean']  + [col for col in df if col != 'mean']
df = df[cols]
Run Code Online (Sandbox Code Playgroud)

您还可以使用更通用的方法.在此示例中,最后一列(由-1表示)作为第一列插入.

cols = [df.columns[-1]] + [col for col in df if col != df.columns[-1]]
df = df[cols]
Run Code Online (Sandbox Code Playgroud)

如果列存在于DataFrame中,您还可以使用此方法按所需顺序重新排序列.

inserted_cols = ['a', 'b', 'c']
cols = ([col for col in inserted_cols if col in df] 
        + [col for col in df if col not in inserted_cols])
df = df[cols]
Run Code Online (Sandbox Code Playgroud)


ern*_*cyp 23

我认为这是一个稍微整洁的解决方案:

df.insert(0, 'mean', df.pop("mean"))
Run Code Online (Sandbox Code Playgroud)

这个解决方案有点类似于@JoeHeffer 的解决方案,但这是一个班轮。

在这里,我们"mean"从数据框中删除列并将其附加到0具有相同列名的索引。

  • 您创建的任何新列都会添加到末尾,所以我猜它会是`df["mean"] = df.pop("mean")` (2认同)

clo*_*ker 17

我自己也遇到了类似的问题,只想添加我所确定的内容.我喜欢reindex_axis() method改变列顺序.这有效:

df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)
Run Code Online (Sandbox Code Playgroud)

基于@Jorge评论的另一种方法:

df = df.reindex(columns=['mean'] + list(df.columns[:-1]))
Run Code Online (Sandbox Code Playgroud)

虽然reindex_axis在微观基准测试中似乎略快一些reindex,但我认为我更喜欢后者的直接性.

  • 这是一个很好的解决方案,但不推荐使用reindex_axis.我使用了reindex,它工作得很好. (4认同)

see*_*spi 16

此功能可以避免您必须列出数据集中的每个变量,只是为了订购其中的一些变量.

def order(frame,var):
    if type(var) is str:
        var = [var] #let the command take a string or list
    varlist =[w for w in frame.columns if w not in var]
    frame = frame[var+varlist]
    return frame 
Run Code Online (Sandbox Code Playgroud)

它需要两个参数,第一个是数据集,第二个是数据集中要添加到前面的列.

所以在我的情况下,我有一个名为Frame的数据集,包含变量A1,A2,B1,B2,Total和Date.如果我想将道达尔带到前线,那么我所要做的就是:

frame = order(frame,['Total'])
Run Code Online (Sandbox Code Playgroud)

如果我想将Total和Date带到前面那么我会:

frame = order(frame,['Total','Date'])
Run Code Online (Sandbox Code Playgroud)

编辑:

使用它的另一个有用的方法是,如果你有一个不熟悉的表,并且你正在查看其中包含特定术语的变量,例如VAR1,VAR2,......你可以执行以下操作:

frame = order(frame,[v for v in frame.columns if "VAR" in v])
Run Code Online (Sandbox Code Playgroud)


Nap*_*Jon 15

简单地说,

df = df[['mean'] + df.columns[:-1].tolist()]
Run Code Online (Sandbox Code Playgroud)


Sam*_*phy 13

您可以使用名称列表重新排序数据框列:

df = df.filter(list_of_col_names)


ott*_*eng 11

您可以执行以下操作(从Aman的答案中借用部分):

cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))

cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]

df = df[cols]
Run Code Online (Sandbox Code Playgroud)


小智 8

只需键入要更改的列名称,然后设置新位置的索引.

def change_column_order(df, col_name, index):
    cols = df.columns.tolist()
    cols.remove(col_name)
    cols.insert(index, col_name)
    return df[cols]
Run Code Online (Sandbox Code Playgroud)

对于您的情况,这将是:

df = change_column_order(df, 'mean', 0)
Run Code Online (Sandbox Code Playgroud)


pom*_*ber 8

将任何列移动到任何位置:

import pandas as pd
df = pd.DataFrame({"A": [1,2,3], 
                   "B": [2,4,8], 
                   "C": [5,5,5]})

cols = df.columns.tolist()
column_to_move = "C"
new_position = 1

cols.insert(new_position, cols.pop(cols.index(column_to_move)))
df = df[cols]
Run Code Online (Sandbox Code Playgroud)


小智 7

我想将两列从我不确切知道所有列的名称的数据框中带到前面,因为它们是从之前的数据透视语句生成的。因此,如果您处于相同的情况:将您知道名称的列放在前面,然后让它们跟在“所有其他列”之后,我想出了以下通用解决方案:

df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1)
Run Code Online (Sandbox Code Playgroud)


rra*_*rra 6

这是对此的一个非常简单的答案(只有一行)。

您可以在将 'n' 列添加到 df 后执行此操作,如下所示。

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5))
df['mean'] = df.mean(1)
df
           0           1           2           3           4        mean
0   0.929616    0.316376    0.183919    0.204560    0.567725    0.440439
1   0.595545    0.964515    0.653177    0.748907    0.653570    0.723143
2   0.747715    0.961307    0.008388    0.106444    0.298704    0.424512
3   0.656411    0.809813    0.872176    0.964648    0.723685    0.805347
4   0.642475    0.717454    0.467599    0.325585    0.439645    0.518551
5   0.729689    0.994015    0.676874    0.790823    0.170914    0.672463
6   0.026849    0.800370    0.903723    0.024676    0.491747    0.449473
7   0.526255    0.596366    0.051958    0.895090    0.728266    0.559587
8   0.818350    0.500223    0.810189    0.095969    0.218950    0.488736
9   0.258719    0.468106    0.459373    0.709510    0.178053    0.414752


### here you can add below line and it should work 
# Don't forget the two (()) 'brackets' around columns names.Otherwise, it'll give you an error.

df = df[list(('mean',0, 1, 2,3,4))]
df

        mean           0           1           2           3           4
0   0.440439    0.929616    0.316376    0.183919    0.204560    0.567725
1   0.723143    0.595545    0.964515    0.653177    0.748907    0.653570
2   0.424512    0.747715    0.961307    0.008388    0.106444    0.298704
3   0.805347    0.656411    0.809813    0.872176    0.964648    0.723685
4   0.518551    0.642475    0.717454    0.467599    0.325585    0.439645
5   0.672463    0.729689    0.994015    0.676874    0.790823    0.170914
6   0.449473    0.026849    0.800370    0.903723    0.024676    0.491747
7   0.559587    0.526255    0.596366    0.051958    0.895090    0.728266
8   0.488736    0.818350    0.500223    0.810189    0.095969    0.218950
9   0.414752    0.258719    0.468106    0.459373    0.709510    0.178053

Run Code Online (Sandbox Code Playgroud)


Mat*_*uzé 6

您可以使用作为唯一元素无序集合的集合来保持“其他列的顺序不变”:

other_columns = list(set(df.columns).difference(["mean"])) #[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用 lambda 通过以下方式将特定列移动到前面:

In [1]: import numpy as np                                                                               

In [2]: import pandas as pd                                                                              

In [3]: df = pd.DataFrame(np.random.rand(10, 5))                                                         

In [4]: df["mean"] = df.mean(1)                                                                          

In [5]: move_col_to_front = lambda df, col: df[[col]+list(set(df.columns).difference([col]))]            

In [6]: move_col_to_front(df, "mean")                                                                    
Out[6]: 
       mean         0         1         2         3         4
0  0.697253  0.600377  0.464852  0.938360  0.945293  0.537384
1  0.609213  0.703387  0.096176  0.971407  0.955666  0.319429
2  0.561261  0.791842  0.302573  0.662365  0.728368  0.321158
3  0.518720  0.710443  0.504060  0.663423  0.208756  0.506916
4  0.616316  0.665932  0.794385  0.163000  0.664265  0.793995
5  0.519757  0.585462  0.653995  0.338893  0.714782  0.305654
6  0.532584  0.434472  0.283501  0.633156  0.317520  0.994271
7  0.640571  0.732680  0.187151  0.937983  0.921097  0.423945
8  0.562447  0.790987  0.200080  0.317812  0.641340  0.862018
9  0.563092  0.811533  0.662709  0.396048  0.596528  0.348642

In [7]: move_col_to_front(df, 2)                                                                         
Out[7]: 
          2         0         1         3         4      mean
0  0.938360  0.600377  0.464852  0.945293  0.537384  0.697253
1  0.971407  0.703387  0.096176  0.955666  0.319429  0.609213
2  0.662365  0.791842  0.302573  0.728368  0.321158  0.561261
3  0.663423  0.710443  0.504060  0.208756  0.506916  0.518720
4  0.163000  0.665932  0.794385  0.664265  0.793995  0.616316
5  0.338893  0.585462  0.653995  0.714782  0.305654  0.519757
6  0.633156  0.434472  0.283501  0.317520  0.994271  0.532584
7  0.937983  0.732680  0.187151  0.921097  0.423945  0.640571
8  0.317812  0.790987  0.200080  0.641340  0.862018  0.562447
9  0.396048  0.811533  0.662709  0.596528  0.348642  0.563092
Run Code Online (Sandbox Code Playgroud)


Joe*_*fer 5

这是一种移动现有列的方法,该列将修改现有数据框。

my_column = df.pop('column name')
df.insert(3, my_column.name, my_column)
Run Code Online (Sandbox Code Playgroud)


Pyg*_*irl 5

import numpy as np
import pandas as pd
df = pd.DataFrame()
column_names = ['x','y','z','mean']
for col in column_names: 
    df[col] = np.random.randint(0,100, size=10000)
Run Code Online (Sandbox Code Playgroud)

您可以尝试以下解决方案:

解决方案1:

df = df[ ['mean'] + [ col for col in df.columns if col != 'mean' ] ]
Run Code Online (Sandbox Code Playgroud)

解决方案2:


df = df[['mean', 'x', 'y', 'z']]
Run Code Online (Sandbox Code Playgroud)

解决方案3:

col = df.pop("mean")
df = df.insert(0, col.name, col)
Run Code Online (Sandbox Code Playgroud)

解决方案4:

df.set_index(df.columns[-1], inplace=True)
df.reset_index(inplace=True)
Run Code Online (Sandbox Code Playgroud)

解决方案5:

cols = list(df)
cols = [cols[-1]] + cols[:-1]
df = df[cols]
Run Code Online (Sandbox Code Playgroud)

解决方案6:

order = [1,2,3,0] # setting column's order
df = df[[df.columns[i] for i in order]]
Run Code Online (Sandbox Code Playgroud)

时间比较:

解决方案1:

CPU时间:用户1.05 ms,系统时间:35 µs,总计:1.08 ms挂墙时间:995 µs

解决方案2

CPU时间:用户933 µs,系统:0 ns,总计:933 µs挂墙时间:800 µs

解决方案3

CPU时间:用户0 ns,sys:1.35 ms,总计:1.35 ms挂墙时间:1.08 ms

解决方案4

CPU时间:用户1.23 ms,sys:45 µs,总计:1.27 ms挂墙时间:986 µs

解决方案5

CPU时间:用户1.09 ms,sys:19 µs,总计:1.11 ms挂墙时间:949 µs

解决方案6

CPU时间:用户955 µs,系统:34 µs,总计:989 µs挂墙时间:859 µs

  • 解决方案 1 是我需要的,因为我有太多列(53),谢谢 (2认同)
  • @Pygirl 哪个值显示真实的消耗时间?(用户、系统、总时间或挂机时间) (2认同)
  • 这对我来说是问题的最佳答案。如此多的解决方案(包括我需要的一个)和简单的方法。谢谢! (2认同)
  • **解决方案 6**(无列表理解):`df = df.iloc[:, [1, 2, 3, 0]]` (2认同)
  • @sergzemsk:/sf/answers/3899142341/。我按墙上时间进行比较。 (2认同)
  • 解决方案 3 是列出的方法中唯一好的方法,因为它是唯一就地且不会干扰索引的方法。那些没有到位的,是无法扩展的。 (2认同)

plh*_*lhn 5

只是翻转经常有帮助。

df[df.columns[::-1]]
Run Code Online (Sandbox Code Playgroud)

或者只是洗牌看看。

import random
cols = list(df.columns)
random.shuffle(cols)
df[cols]
Run Code Online (Sandbox Code Playgroud)