是否可以更改数据框中列的顺序?
如果是,那会比制作副本更快吗?我正在处理一个包含1亿多行的大型数据帧。
我看到如何用副本更改订单: How to change the order of DataFrame columns?
答案 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 中删除。