更改Pandas数据帧列顺序

时间:2014-09-16 20:50:46

标签: python pandas

是否可以更改数据框中列的顺序?

如果是,那会比制作副本更快吗?我正在处理一个包含1亿多行的大型数据帧。

我看到如何用副本更改订单: How to change the order of DataFrame columns?

3 个答案:

答案 0 :(得分:3)

如果不制作副本,他们就不容易做到这一点。从理论上讲,如果你只有一个dtype(或只是改变了标签改变dtypes的列,那么就可以)。但是相当复杂,因此没有实施。

那就是说,如果你小心,你可以这样做。你应该只使用单一的dtyped框架(你被预先警告)。

In [22]: df = DataFrame(np.random.randn(5,3),columns=list('ABC'))

In [23]: df
Out[23]: 
          A         B         C
0 -0.696593 -0.459067  1.935033
1  1.783658  0.612771  1.553773
2 -0.572515  0.634174  0.113974
3 -0.908203  1.454289  0.509968
4  0.776575  1.629816  1.630023

如果df是多重数据,那么df.values将不会是一个视图(当然你可以选择单个dtyped框架,这是一个视图本身)。另一个注意事项,这并不总是可以将其作为一种观点出现。这取决于你在做什么,YMMV。

e.g。 df.values.take([2,0,1],axis=1)为您提供相同的结果但是复制。

In [24]: df2 = DataFrame(df.values[:,[2,0,1]],columns=list('ABC'))

In [25]: df2
Out[25]: 
          A         B         C
0  1.935033 -0.696593 -0.459067
1  1.553773  1.783658  0.612771
2  0.113974 -0.572515  0.634174
3  0.509968 -0.908203  1.454289
4  1.630023  0.776575  1.629816

我们对原始值有了看法

In [26]: df2.values.base
Out[26]: 
array([[ 1.93503267,  1.55377291,  0.1139739 ,  0.5099681 ,  1.63002264],
       [-0.69659276,  1.78365777, -0.5725148 , -0.90820288,  0.7765751 ],
       [-0.45906706,  0.61277136,  0.63417392,  1.45428912,  1.62981613]])

请注意,如果您再分配给df2(例如另一个浮点列),则会触发一个副本。所以你必须非常小心。

那说从另一个帧的视图创建几乎没有内存,只是一个指针,所以非常快。

答案 1 :(得分:0)

嗯...没有人建议放下并插入:

df = pd.DataFrame([['a','b','c']],columns=list('ABC'))

print('Before', id(df))

for i,col in enumerate(['C','B', 'A']):
    tmp = df[col]
    df.drop(labels=[col],axis=1,inplace=True)
    df.insert(i,col,tmp)    
    
print('After ', id(df))
df.head()

结果将保留原始数据帧

Before 140441780394360
After  140441780394360

   C    B   A
   ----------
0  c    b   a

答案 2 :(得分:0)

这是一种更短且内存效率更高的方法(因为不需要保存额外的临时变量):

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

new_order = ["B", "C", "A"]
for column in new_order:
    df[column] = df.pop(column)

这是可行的,因为新列以新顺序分配给DataFrame,旧列一一删除。 Pop 返回一列并将其从 DataFrame 中删除。