你的问题表明,当你这样做的时候,你认为
df = df.with_columns(
new_column = pl.lit('some_text')
)
你把所有的东西都复制到某个新的DF上,这将是非常低效的.
你是对的,这将是非常低效的,但事实并非如此.DataFrame只是一种组织指向实际数据的指针的方法.层次 struct 是你在顶部的数据帧.在DataFrame中是表示列的Serieses.即使在系列级别,它仍然只是指针,而不是数据.它由一个或多个块数组组成,符合apache arrow内存模型.
当你"创建一个新的df"时,你所做的只是组织指针,而不是数据.数据不会移动或复制.
相反,想想Pandas 的inplace
个参数.这肯定会让人觉得你是在原地修改东西,而不是复制.
In Place通常不执行任何原地操作
而是复制并重新分配指针
https://github.com/pandas-dev/pandas/issues/16529#issuecomment-323890422个
问题的关键在于,在pandas中,你所做的一切都会产生一个(或多个)副本.在polars中,情况并非如此,所以即使你分配了一个新的df,新的df也只是指向数据的外层.数据不会移动,也不会复制,除非您专门执行了这样的操作.
也就是说,有一些方法可以在不要求您使用df=df...
语法的情况下插入列,但它们在幕后做的事情与使用首选赋值语法时没有什么不同.