Python 就地更改数据帧列顺序

Python 就地更改数据帧列顺序,python,pandas,Python,Pandas,是否可以就地更改数据帧中列的顺序 如果是的话,那会比复印更快吗?我正在处理一个包含1亿多行的大型数据帧 我了解如何使用副本更改订单: 如果不制作副本,他们的方法很难做到这一点。理论上,如果您只有一个数据类型(或者仅更改标签中的列更改数据类型),则可以这样做。但它相当复杂,因此没有实现 也就是说,如果你小心,你可以做到这一点。您应该只使用一个数据类型的帧来执行此操作(系统会预先警告您) 如果df是多数据类型的,那么df.values将不是一个视图(当然,您可以再选择一个数据类型的帧,它本身就是一个

是否可以就地更改数据帧中列的顺序

如果是的话,那会比复印更快吗?我正在处理一个包含1亿多行的大型数据帧

我了解如何使用副本更改订单:
如果不制作副本,他们的方法很难做到这一点。理论上,如果您只有一个数据类型(或者仅更改标签中的列更改数据类型),则可以这样做。但它相当复杂,因此没有实现

也就是说,如果你小心,你可以做到这一点。您应该只使用一个数据类型的帧来执行此操作(系统会预先警告您)

如果
df
是多数据类型的,那么df.values将不是一个视图(当然,您可以再选择一个数据类型的帧,它本身就是一个视图)。另一个值得注意的是,这并不总是能够作为一种观点出现。这取决于你在做什么,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(例如另一个浮点列),则将触发一个副本。所以你必须非常小心


也就是说,从另一帧的视图创建几乎不占用内存,只是一个指针,速度非常快。

嗯。。。没有人建议删除并插入:

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

以下是一种简短且更节省内存的方法(因为不需要保存额外的临时变量):

df=pd.DataFrame({“A”:[0,1],“B”:[2,3],“C”:[4,5]})
新的顺序=[“B”、“C”、“A”]
对于按新顺序排列的列:
df[column]=df.pop(column)

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

您需要多久执行一次?为什么列的顺序很重要?通过执行类似于
newdf=df[new\u column\u order]
的操作需要多长时间?@acushner它对于显示数据非常有用,例如在Jupyter笔记本中。在这种情况下,格式化可能很重要。问题是pandas DataFrame有一个内部块管理器,它将具有相同数据类型的列合并到单个连续内存块中。当熊猫“认为”(读“难以启齿”)这样做更好时,合并可能会发生
df[col]
不复制,但插入后,三列不再按给定顺序连续。因此,当我们对数据帧进行一些计算时,熊猫可能会进行复制。
Before 140441780394360
After  140441780394360

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