如何改变DataFrame列的顺序?
我有以下DataFrame
( df
):
import numpy as np import pandas as pd df = pd.DataFrame(np.random.rand(10, 5))
我通过分配添加更多的列:
df['mean'] = df.mean(1)
如何将列mean
移到前面,即将其设置为第一列,而不改变其他列的顺序?
一个简单的方法是重新分配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']
以任何你想要的方式重新排列列。 这就是我把最后一个元素移到第一个位置的方法:
In [12]: cols = cols[-1:] + cols[:-1] In [13]: cols Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]
然后像这样重新sortingdataframe:
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
你也可以做这样的事情:
df = df[['mean', '0', '1', '2', '3']]
您可以通过以下方式获取列的列表:
cols = list(df.columns.values)
输出将产生:
['0', '1', '2', '3', 'mean']
…然后在将其放入第一个函数之前手动重新排列
只需按照您所需的顺序将列名分配给<dataframe>.columns
如下所示:
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.insert(0, 'mean', df.mean(1))
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
在你的情况下,
df = df.reindex_axis(['mean',0,1,2,3,4], axis=1)
会做你想要的。
在我的情况(一般forms):
df = df.reindex_axis(sorted(df.columns), axis=1) df = df.reindex_axis(['opened'] + list([a for a in df.columns if a != 'opened']), axis=1)
您需要按照所需的顺序创build一个新的列列表,然后使用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中,也可以使用此方法按照所需的顺序对列进行重新sorting。
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 = df[['mean'] + df.columns[:-1].tolist()]
def order(frame,var): varlist =[w for w in frame.columns if w not in var] frame = frame[var+varlist] return frame
这个函数有两个参数,第一个是数据集,第二个是你要把数据集中的列。
所以在我的情况下,我有一个数据集称为框架与variablesA1,A2,B1,B2,总计和date。 如果我想把Total带到前面,那我所要做的就是:
frame = order(frame,['Total'])
如果我想把Total和Date带到前面,那么我会这样做:
frame = order(frame,['Total','Date'])
编辑:
另一个有用的方法是,如果你有一个不熟悉的表,并且你正在寻找具有特定术语的variables,比如VAR1,VAR2,你可以执行如下的操作:
frame = order(frame,[v for v in frame.columns if "VAR" in v])
我自己遇到了一个类似的问题,只是想补充一下我所定下的。 我喜欢改变列顺序的reindex_axis()方法。 这工作:
df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)
你可以做以下(从阿曼的答案借用部分):
cols = df.columns.tolist() cols.insert(0, cols.pop(-1)) cols >>>['mean', 0L, 1L, 2L, 3L, 4L] df = df[cols]
这个问题之前已经回答了:
df.reindex_axis(sorted(df.columns), axis=1)
如何使用“T”?
df.T.reindex(['mean',0,1,2,3,4]).T
set()
:
一个简单的方法是使用set()
,特别是当你有一个很长的列的列表,不想手动处理它们:
cols = list(set(df.columns.tolist()) - set(['mean'])) cols.insert(0, 'mean') df = df[cols]
只需input要更改的列名称,然后设置新位置的索引。
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)
我尝试了Wes McKinneybuild议的insert()
函数。
df.insert(0,'mean',df.mean(1))
这就得到了Timmie想要的结果,而不需要移动最后一列。
我相信@阿曼的答案是最好的,如果你知道另一列的位置。
如果你不知道mean
的位置,但只有它的名字,你不能直接求助于cols = cols[-1:] + cols[:-1]
。 以下是我能想出的下一个最好的东西:
meanDf = pd.DataFrame(df.pop('mean')) # now df doesn't contain "mean" anymore. Order of join will move it to left or right: meanDf.join(df) # has mean as first column df.join(meanDf) # has mean as last column
最简单的方法就是像这样改变列名的顺序
df = df[['mean', Col1,Col2,Col3]]
@clocker:你的解决scheme对我非常有帮助,因为我想从一个数据框前面插入两列,我不知道所有列的名字,因为它们是从一个pivot语句生成的。 所以,如果你处于同样的状况:把前面的专栏带到你知道名字的地方,然后让它们跟随“所有其他专栏”,我提出了以下一般性的解决办法;
df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1)
DataFrame.sort_index(axis=1)
很干净。 在这里检查文档 。 然后concat