我有以下的DataFrame
(df
):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
我通过赋值来添加更多列:
df['mean'] = df.mean(1)
如何将列 mean
移动到最前面,即将其设置为第一列,同时不改变其他列的顺序?
一种简单的方法是使用一个列的列表重新分配数据框,根据需要重新排列。
这是你现在拥有的:
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
cols
的类型是list
,它甚至允许重复(在使用数据框时会被丢弃)。你可能想要使用Index
对象。 - alexis你也可以像这样做:
df = df[['mean', '0', '1', '2', '3']]
你可以使用以下方式获取列的列表:
cols = list(df.columns.values)
输出结果将是:
['0', '1', '2', '3', 'mean']
在将其放入第一个函数之前,可以轻松地手动重新排列。
df.columns.tolist()
- Jimpd.read_csv()
将CSV文件导入为Pandas pd,那么你的答案如何用于更改列顺序呢? - Robvh只需按照您想要的顺序分配列名:
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]]
现在,“平均值”列排在最前面:
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
<df>.columns
分配值。 - 3pitt对于 pandas >= 1.3(2022 年编辑):
df.insert(0, 'mean', df.pop('mean'))
对于Pandas版本小于1.3的情况,怎么处理呢?
df.insert(0, 'mean', df['mean'])
pandas
未来的一个特性?比如像df.move(0, df.mean)
这样的功能? - jason*** ValueError: cannot insert mean, already exists
。 - SpinUp __ A Davis根据你的情况,
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']) ))
copy=False
,但似乎 reindex_axis
仍然会创建一个副本。 - Konstantincopy=False
是否会创建一个副本?文档称,当 copy=True
时,reindex
会返回一个新对象,暗示它否则可能是同一个旧对象;如果是同一个对象,那么如何成为副本呢? - stucashimport 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毫秒,系统:35微秒,总共:1.08毫秒墙面时间:995微秒
解决方案2:
CPU时间:用户933微秒,系统:0纳秒,总共:933微秒 墙面时间:800微秒
解决方案3:
CPU时间:用户0纳秒,系统:1.35毫秒,总共:1.35毫秒 墙面时间:1.08毫秒
解决方案4:
CPU时间:用户1.23毫秒,系统:45微秒,总共:1.27毫秒 墙面时间:986微秒
解决方案5:
CPU时间:用户1.09毫秒,系统:19微秒,总共:1.11毫秒 墙面时间:949微秒
解决方案6:
CPU时间:用户955微秒,系统:34微秒,总共:989微秒 墙面时间:859微秒
df = df.iloc[:, [1, 2, 3, 0]]
- Dmitriy Work您需要按照所需的顺序创建一个新的列列表,然后使用 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]
如果数据框中存在需要排序的列,您也可以使用这种方法对列进行重新排序,使它们按照所需的顺序排列。
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]
df
的数据框,其中包含A
、B
和C
列。最简单的方法是:
df = df.reindex(['B','C','A'], axis=1)
df2 = df.reindex(['B', 'C', 'A'], axis=1)
。感谢您提供这个答案! - Andreas Forslöw如果您的列名太长而无法手动输入,则可以通过一个整数列表指定新顺序,其中包含位置:
数据:
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
这种方法的主要问题在于,多次调用相同的代码会产生不同的结果,因此需要小心 :)
MultiIndex
。 - jppdf = df[新排列的列名列表]
;D - starriet