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