Python 当数据帧中的列太多时,如何更改列顺序?

Python 当数据帧中的列太多时,如何更改列顺序?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个包含许多列的大熊猫数据框架 我想更改列的顺序,以便只首先显示其中的一个子集。我不在乎其余部分的顺序(而且变量太多,无法全部列出) 例如,如果我的数据帧是这样的 a b c d e f g h i 5 8 7 2 1 4 1 2 3 1 4 2 2 3 4 1 5 3 我想指定列的子集 mysubset=['d','f']并对数据帧重新排序,以便 现在列的顺序为 d、f、a、b、c、e、g、h、i 有没有一种像熊猫一样的方法可以做到这一点?使用多索引可以做到这一点: priority=[

我有一个包含许多列的大熊猫数据框架

我想更改列的顺序,以便只首先显示其中的一个子集。我不在乎其余部分的顺序(而且变量太多,无法全部列出)

例如,如果我的数据帧是这样的

a b c d e f g h i
5 8 7 2 1 4 1 2 3
1 4 2 2 3 4 1 5 3
我想指定列的子集

mysubset=['d','f']
并对数据帧重新排序,以便 现在列的顺序为

d、f、a、b、c、e、g、h、i


有没有一种像熊猫一样的方法可以做到这一点?

使用多索引可以做到这一点:

priority=[ 0 if x in {'d','f'} else 1 for x in df.columns]
newdf=df.T.set_index([priority,df.columns]).sort_index().T 
那么你有:

In [3]: newdf
Out[3]: 
   0     1                  
   d  f  a  b  c  e  g  h  i
0  2  4  5  8  7  1  1  2  3
1  2  4  1  4  2  3  1  5  3

要移动整个列子集,可以执行以下操作:

#!/usr/bin/python

import numpy as np
import pandas as pd

dates = pd.date_range('20130101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
print df
cols = df.columns.tolist()
print cols
mysubset = ['B','D']
for idx, item in enumerate(mysubset):
    cols.remove(item)
    cols.insert(idx, item) 
print cols
df = df[cols]
print df
这里我先移动了B和D,让其他人跟着。输出:

                   A         B         C         D
2013-01-01  0.905122 -0.004839 -0.697663 -1.307550
2013-01-02  0.651998 -1.092546  0.594493  0.341066
2013-01-03  0.355832 -0.840057  0.016989  0.377502
2013-01-04 -0.544407  0.826708 -0.889118  0.871769
2013-01-05  0.190630  0.717418  1.325479 -0.882652
2013-01-06  2.730582  0.195908 -0.657642  1.606263
['A', 'B', 'C', 'D']
['B', 'D', 'A', 'C']
                   B         D         A         C
2013-01-01 -0.004839 -1.307550  0.905122 -0.697663
2013-01-02 -1.092546  0.341066  0.651998  0.594493
2013-01-03 -0.840057  0.377502  0.355832  0.016989
2013-01-04  0.826708  0.871769 -0.544407 -0.889118
2013-01-05  0.717418 -0.882652  0.190630  1.325479
2013-01-06  0.195908  1.606263  2.730582 -0.657642


有关更多信息,请阅读此内容。

您可以使用列掩码:

>>> mysubset = ["d","f"]
>>> mask = df.columns.isin(mysubset)
>>> pd.concat([df.loc[:,mask], df.loc[:,~mask]], axis=1)
   d  f  a  b  c  e  g  h  i
0  2  4  5  8  7  1  1  2  3
1  2  4  1  4  2  3  1  5  3
或使用排序后的

>>> mysubset = ["d","f"]
>>> df[sorted(df, key=lambda x: x not in mysubset)]
   d  f  a  b  c  e  g  h  i
0  2  4  5  8  7  1  1  2  3
1  2  4  1  4  2  3  1  5  3

这是因为不在mysubset中的
x对于
d
f
将为False,而False我通常会这样做:

mysubset = ['d', 'f']
othercols = [c for c in df.columns if c not in mysubset]
df = df[mysubset+othercols]

谢谢,但这不允许我选择columns@Noobieupdtaed,这就是你想要的吗?:)谢谢考虑到我的数据量,我担心转置和设置索引会太长……非常好,我的感觉是排序更有效,因为它不会复制数据集。非常好的解决方案DSM!然而,我会留下我的答案,以及一个不同的方法,但我更喜欢你的。伟大的答案在那里!谢谢root和DSM是最简洁的pythonesque。DSM是第一个。祝您有个美好的一天!