如何更改 DataFrame 列的顺序?

How to change the order of DataFrame columns?

提问人:Timmie 提问时间:10/31/2012 最后编辑:nickTimmie 更新时间:6/22/2023 访问量:2376645

问:

我有以下几点():DataFramedf

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5))

我通过赋值添加更多列:

df['mean'] = df.mean(1)

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

Python Pandas 数据帧

评论

3赞 Laurence 1/4/2013
Python Pandas 的可能重复项 - 根据列名对数据帧中的列重新排序
2赞 jpp 10/3/2018
有关基于 NumPy 的通用解决方案,请参阅如何在 pandas 数据帧中移动列,假设只有一个列级别,即 no 。MultiIndex
1赞 ravibeli 6/6/2020
经过充分的搜索,我得到了这个最好的链接,用非常简单的术语重新排列多个逻辑 [pandas 的列重新排列逻辑] [datasciencemadesimple.com/...
1赞 starriet 4/12/2022
归根结底,重点是:;Ddf = df[ list with newly arranged column names ]
1赞 PJ_ 5/19/2022
对于 2022 年,@WesMckinney的答案比顶级答案更新

答:

1379赞 Aman 10/31/2012 #1

一种简单的方法是使用列列表重新分配 DataFrame,并根据需要重新排列。

这就是你现在所拥有的:

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']

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

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

In [13]: cols
Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]

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

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

评论

43赞 moeabdol 1/10/2015
如果您得到“无法连接'str'和'list'对象”,请确保您 [] 以 cols 为单位的 str 值:cols = [cols[7]] + cols[:7] + cols[8:]
4赞 Aman 10/7/2016
@FooBar这不是一个集合并集,而是两个有序列表的串联。
3赞 FooBar 10/7/2016
@Aman 我只是指出您的代码已弃用。您对帖子的处理由您自行决定。
2赞 alexis 2/28/2017
@FooBar,类型是;它甚至允许重复(在 DataFrame 上使用时将被丢弃)。你在想物体。colslistIndex
20赞 Konstantin 11/27/2017
这意味着复制所有数据,这是非常低效的。我希望熊猫有办法在不创建副本的情况下做到这一点。
366赞 Wes McKinney 11/10/2012 #2

对于熊猫 >= 1.3(2022 年编辑):

df.insert(0, 'mean', df.pop('mean'))

怎么样(对于熊猫< 1.3,原始答案)

df.insert(0, 'mean', df['mean'])

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

评论

82赞 jason 5/27/2014
这可能是将来添加到的功能吗?类似的东西 ?pandasdf.move(0,df.mean)
8赞 CKM 8/20/2019
这是一个可扩展的解决方案,因为其他解决方案是手动键入列名。
16赞 SpinUp __ A Davis 2/25/2020
这适用于创建新列时 OP 的问题,但不适用于移动列;尝试将结果移入*** ValueError: cannot insert mean, already exists
10赞 Sumax 7/29/2020
这是一个干净的解决方案。现代 API 方法是:df.insert(0, 'mean', df['mean'])
4赞 Sven 2/5/2022
对于最新的 pandas 版本,如果该列已存在,则会抛出错误。但是,有一个非常简单的解决方案:df.insert(0, “mean”, df.pop(“mean”)) 只需“弹出”同一列即可。
67赞 dmvianna 1/4/2013 #3

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

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

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

df = df.reindex(['the','order','you','want'], axis=1)

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

评论

23赞 smci 4/17/2013
不,那是不同的。在那里,用户希望按名称对所有列进行排序。在这里,他们希望将一列移动到第一列,同时保持其他列的顺序不变。
2赞 Chankey Pathak 6/8/2017
如果您不希望它们排序怎么办?
0赞 mins 12/15/2020
答案不涉及问题中的问题。
1赞 dmvianna 12/16/2020
@mins 我希望上面的编辑足够清晰。:)
0赞 mins 12/16/2020
您的编辑现在显示了该问题的有效解决方案。谢谢。
856赞 freddygv 5/19/2014 #4

你也可以做这样的事情:

df = df[['mean', '0', '1', '2', '3']]

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

cols = list(df.columns.values)

输出将产生:

['0', '1', '2', '3', 'mean']

...然后很容易手动重新排列,然后再将其放入第一个功能中

评论

10赞 Jim 10/10/2015
您还可以使用 list(df.columns) 获取列列表
33赞 Jim 10/10/2015
df.columns.tolist()
0赞 Sid 3/20/2018
对于像我这样的新手,请重新排列您从同事那里获得的列表。然后 df=df[cols],即重新排列的列表被放入第一个表达式中,而没有一组括号。
7赞 Robvh 7/25/2019
我认为这不是一个好的答案,因为它没有提供如何更改任何数据帧的列顺序的代码。假设我将 csv 文件导入为 pandas pd 作为 .如何使用您的答案来更改列顺序?pd.read_csv()
7赞 daniel brandstetter 9/10/2019
@Robvh,第二行代码说明如何获取现有列名。从那里,您可以将输出复制到第一行代码中,并根据需要重新排列。唯一需要知道的另一条信息是,如果没有标题,默认列名是整数,而不是字符串。
20赞 seeiespi 7/30/2014 #5

此函数避免了您不必列出数据集中的每个变量,只是为了对其中的几个变量进行排序。

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 

它有两个参数,第一个是数据集,第二个是要放在前面的数据集中的列。

因此,就我而言,我有一个名为 Frame 的数据集,其中包含变量 A1、A2、B1、B2、Total 和 Date。如果我想把道达尔带到前面,那么我所要做的就是:

frame = order(frame,['Total'])

如果我想将 Total 和 Date 放在前面,那么我会这样做:

frame = order(frame,['Total','Date'])

编辑:

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

frame = order(frame,[v for v in frame.columns if "VAR" in v])
23赞 clocker 8/28/2014 #6

我自己也遇到了类似的问题,只是想补充一下我确定的内容。我喜欢更改列顺序。这奏效了:reindex_axis() method

df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)

基于@Jorge注释的替代方法:

df = df.reindex(columns=['mean'] + list(df.columns[:-1]))

虽然在微基准测试中似乎比 ,但我认为我更喜欢后者的直接性。reindex_axisreindex

评论

7赞 Jorge 8/9/2018
这是一个很好的解决方案,但reindex_axis将被弃用。我使用了 reindex,它工作得很好。
0赞 mins 12/15/2020
我可能会错过一些东西,但 1/您可能忘记在第二个解决方案中包含使用列,而不是行。2/ 在 2020 年,该解决方案更改了行/列顺序,但也清除了数据(无处不在)。axis=1reindexNaN
19赞 Napitupulu Jon 4/28/2015 #7

简单地做,

df = df[['mean'] + df.columns[:-1].tolist()]

评论

0赞 parvij 1/5/2016
TypeError:无法隐式将“int”对象转换为 str
0赞 Napitupulu Jon 1/8/2016
可能是 API 已经更改,您也可以这样做......order = df.columns.tolist() df['mean'] = df.mean(1) df.columns = ['mean'] + order
1赞 hlongmore 6/21/2017
这种变化对我来说效果很好。对于用于创建字典的现有列表,然后用于创建 DataFrame,我调用了 。我遇到的唯一问题是我已经调用了 ,所以当重新索引完成时,它添加了另一个列,因为原来的列现在是索引。至于上面指定的语法,在 python 解释器中给我headersdf.reindex(columns=headers)df.set_index('some header name', inplace=True)some header name['mean'] + df.columnsIndex(u'meanAddress', u'meanCity', u'meanFirst Name'...
1赞 Napitupulu Jon 6/21/2017
@hlongmore:我不知道你之前的代码是,但编辑应该可以工作(使用 0.19.2)
0赞 hlongmore 6/23/2017
编辑确实有效(我在 0.20.2 上)。就我而言,我已经得到了我想要的列,所以我认为 df.reindex() 是我真正应该使用的。
411赞 fixxxer 4/28/2015 #8

只需按照所需的顺序分配列名:

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]]

现在,“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

评论

13赞 user3226167 6/2/2017
它会制作副本吗?
47赞 AGS 7/22/2017
@NicholasMorley - 如果您的 df 中有 1000 列,这不是最佳答案。
2赞 3pitt 2/20/2018
您似乎并没有像您最初声称的那样分配<df>.columns
18赞 RyanC 4/20/2018
对于少量列,这是最佳答案。
7赞 James Hirschorn 5/5/2018
这只是@freddygv之前回答的副本。那个应该是公认的答案,而不是这个。
83赞 Alexander 8/21/2015 #9

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

cols = ['mean']  + [col for col in df if col != 'mean']
df = df[cols]

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

cols = [df.columns[-1]] + [col for col in df if col != df.columns[-1]]
df = df[cols]

如果列存在于 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]
12赞 ccerhan 5/6/2016 #10

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

def change_column_order(df, col_name, index):
    cols = df.columns.tolist()
    cols.remove(col_name)
    cols.insert(index, col_name)
    return df[cols]

对于您的情况,这将是:

df = change_column_order(df, 'mean', 0)
3赞 ZEE 6/27/2016 #11

使用怎么样?T

df = df.T.reindex(['mean', 0, 1, 2, 3, 4]).T
199赞 Alvaro Silvino 8/31/2016 #12

就您而言,

df = df.reindex(columns=['mean',0,1,2,3,4])

会做你想做的事。

就我而言(一般形式):

df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))

评论

2赞 Konstantin 11/27/2017
我尝试设置,但看起来仍然创建一个副本。copy=Falsereindex_axis
1赞 Alvaro Silvino 11/27/2017
@Konstantin你能再问一个问题吗?最好有更多的背景
0赞 stucash 12/3/2021
@Konstantin只是好奇,您是否调试过以查看创建副本?文档声称,当 返回一个新对象时,表明否则它将是同一个旧对象;如果它是同一个对象,它怎么可能是复制品?copy=Falsecopy=Truereindex
12赞 otteheng 12/8/2016 #13

你可以做以下事情(借用安缦的回答):

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

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

df = df[cols]
8赞 matthhias 7/27/2017 #14

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

df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1)

评论

0赞 rubengavidia0x 1/27/2022
FutureWarning:“.reindex_axis”已弃用,将在将来的版本中删除。请改用“.reindex”。
3赞 Shoresh 9/12/2017 #15

一个简单的方法是使用 set(),特别是当你有一长串列并且不想手动处理它们时:

cols = list(set(df.columns.tolist()) - set(['mean']))
cols.insert(0, 'mean')
df = df[cols]

评论

2赞 pnv 3/6/2018
一个警告:如果你把它放在集合中,列的顺序就会消失
0赞 Shoresh 3/6/2018
有趣!@user1930402我已经多次尝试了上述方法,但从未遇到任何问题。我会再次仔细检查。
4赞 silgon 12/18/2017 #16

您可以使用可用于两个轴的 which:reindex

df
#           0         1         2         3         4      mean
# 0  0.943825  0.202490  0.071908  0.452985  0.678397  0.469921
# 1  0.745569  0.103029  0.268984  0.663710  0.037813  0.363821
# 2  0.693016  0.621525  0.031589  0.956703  0.118434  0.484254
# 3  0.284922  0.527293  0.791596  0.243768  0.629102  0.495336
# 4  0.354870  0.113014  0.326395  0.656415  0.172445  0.324628
# 5  0.815584  0.532382  0.195437  0.829670  0.019001  0.478415
# 6  0.944587  0.068690  0.811771  0.006846  0.698785  0.506136
# 7  0.595077  0.437571  0.023520  0.772187  0.862554  0.538182
# 8  0.700771  0.413958  0.097996  0.355228  0.656919  0.444974
# 9  0.263138  0.906283  0.121386  0.624336  0.859904  0.555009

df.reindex(['mean', *range(5)], axis=1)

#        mean         0         1         2         3         4
# 0  0.469921  0.943825  0.202490  0.071908  0.452985  0.678397
# 1  0.363821  0.745569  0.103029  0.268984  0.663710  0.037813
# 2  0.484254  0.693016  0.621525  0.031589  0.956703  0.118434
# 3  0.495336  0.284922  0.527293  0.791596  0.243768  0.629102
# 4  0.324628  0.354870  0.113014  0.326395  0.656415  0.172445
# 5  0.478415  0.815584  0.532382  0.195437  0.829670  0.019001
# 6  0.506136  0.944587  0.068690  0.811771  0.006846  0.698785
# 7  0.538182  0.595077  0.437571  0.023520  0.772187  0.862554
# 8  0.444974  0.700771  0.413958  0.097996  0.355228  0.656919
# 9  0.555009  0.263138  0.906283  0.121386  0.624336  0.859904
20赞 Joe Heffer 1/4/2018 #17

下面是移动一个现有列的方法,该列将修改现有数据帧。

my_column = df.pop('column name')
df.insert(3, my_column.name, my_column)  # Is in-place

评论

0赞 Asclepius 1/15/2021
这几乎是唯一好的方法,因为它是到位的。大多数其他方法都未到位,因此不可扩展。
3赞 freeB 1/30/2018 #18

下面是一个函数,可以对任意数量的列执行此操作。

def mean_first(df):
    ncols = df.shape[1]        # Get the number of columns
    index = list(range(ncols)) # Create an index to reorder the columns
    index.insert(0,ncols)      # This puts the last column at the front
    return(df.assign(mean=df.mean(1)).iloc[:,index]) # new df with last column (mean) first
11赞 pomber 2/27/2018 #19

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

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]
66赞 Yuca 8/21/2018 #20

如果您的列名太长而无法键入,则可以通过带有以下位置的整数列表来指定新顺序:

数据:

          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

一般示例:

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

虽然看起来我只是以不同的顺序显式地键入列名,但有一个列“mean”这一事实应该清楚地表明它与实际位置而不是列名有关。new_order

对于OP问题的具体情况:

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

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

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

4赞 Kaustubh J 4/12/2019 #21

书中最骇人听闻的方法

df.insert(0, "test", df["mean"])
df = df.drop(columns=["mean"]).rename(columns={"test": "mean"})
29赞 erncyp 11/6/2019 #22

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

df.insert(0, 'mean', df.pop("mean"))

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

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

评论

0赞 Roko Mijic 6/12/2020
这很好,但如果你想让它在最后消失怎么办?
2赞 erncyp 6/12/2020
您创建的任何新列都会添加到末尾,所以我想它会是df["mean"] = df.pop("mean")
123赞 Pygirl 11/9/2019 #23
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)

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

解决方案 1:

df = df[ ['mean'] + [ col for col in df.columns if col != 'mean' ] ]

解决方案 2:


df = df[['mean', 'x', 'y', 'z']]

解决方案 3:

col = df.pop("mean")
df = df.insert(0, col.name, col)

解决方案 4:

df.set_index(df.columns[-1], inplace=True)
df.reset_index(inplace=True)

解决方案 5:

cols = list(df)
cols = [cols[-1]] + cols[:-1]
df = df[cols]

解决方案 6:

order = [1,2,3,0] # setting column's order
df = df[[df.columns[i] for i in order]]

时间比较:

解决方案 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,系统:1.35 毫秒,总计:1.35 毫秒 挂机时间:1.08 ms

解决方案 4

CPU 时间:用户 1.23 毫秒,系统:45 μs,总计:1.27 毫秒 壁时间:986 μs

解决方案 5

CPU 时间:用户 1.09 毫秒,系统:19 μs,总计:1.11 毫秒 壁时间:949 μs

解决方案 6

CPU 时间:用户 955 μs,系统:34 μs,总计:989 μs 壁时间:859 μs

评论

2赞 ratnesh 4/1/2020
解决方案 1 是我需要的,因为我有太多列(53),谢谢
2赞 sergzemsk 4/11/2020
@Pygirl值显示实际消耗时间?(用户、系统、总时间或墙时间)
2赞 Gustavo Rottgering 5/15/2020
对我来说,这是解决问题的最佳答案。如此多的解决方案(包括我需要的解决方案)和简单的方法。谢谢!
2赞 Dmitriy Work 5/21/2020
解决方案 6(无列表理解):df = df.iloc[:, [1, 2, 3, 0]]
2赞 Pygirl 9/29/2020
@sergzemsk:stackoverflow.com/a/55702033/6660373。我按墙时间比较。
5赞 plhn 4/10/2020 #24

只是翻转往往会有所帮助。

df[df.columns[::-1]]

或者只是洗牌看一看。

import random
cols = list(df.columns)
random.shuffle(cols)
df[cols]
4赞 CSQL 5/8/2020 #25

一个非常简单的解决方案,对我有用,是用于:.reindexdf.columns

df = df[df.columns.reindex(['mean', 0, 1, 2, 3, 4])[0]]
73赞 liangli 5/30/2020 #26

假设你有 .dfABC

最简单的方法是:

df = df.reindex(['B','C','A'], axis=1)

评论

0赞 cheevahagadog 9/23/2020
这个选项的一大优点是你可以在熊猫管道操作中使用它!
2赞 Andreas Forslöw 12/8/2020
请注意,这只会返回重新索引的数据框,而不会更改正在使用的实例。如果要使用重新索引的 df,只需使用返回值:。感谢您的回答!dfdf2 = df.reindex(['B', 'C', 'A'], axis=1)
0赞 liangli 2/25/2021
@cheevahagadog说得好!
0赞 liangli 2/25/2021
@AndreasForslöw 感谢您强调这一点。
6赞 rra 6/19/2020 #27

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

在将“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

6赞 Mathia Haure-Touzé 7/4/2020 #28

您可以使用一个集合,它是唯一元素的无序集合,以保持“其他列的顺序不变”:

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

然后,您可以通过以下方式使用 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
36赞 Sam Murphy 4/13/2021 #29

您可以使用以下名称列表对数据帧列进行重新排序:

df = df.filter(['list', 'of', 'column', 'names'])

pandas .filter 文档

3赞 Chadee Fouad 11/6/2021 #30

这是一个超级简单的方法示例。如果要从 excel 复制标题,请使用.split('\t')

df = df['FILE_NAME DISPLAY_PATH SHAREPOINT_PATH RETAILER LAST_UPDATE'.split()]