cnp*_*yer 11 python concatenation append python-polars
我发现可以使用系列名称空间进行附加(/sf/answers/4941934161/)。我想知道是否有类似的方法来附加或连接数据帧。
从pandas
历史上看,这可以通过df1.append(df2)
. 但是,该方法已被弃用(如果尚未被弃用)pd.concat([df1, df2])
。
df1
A | 乙 | C |
---|---|---|
1 | 2 | 3 |
df2
A | 乙 | C |
---|---|---|
4 | 5 | 6 |
资源
A | 乙 | C |
---|---|---|
1 | 2 | 3 |
4 | 5 | 6 |
rit*_*e46 35
append
根据您的需求,有不同的策略。
df1 = pl.DataFrame({"a": [1], "b": [2], "c": [3]})
df2 = pl.DataFrame({"a": [4], "b": [5], "c": [6]})
# new memory slab
new_df = pl.concat([df1, df2], rechunk=True)
# append free (no memory copy)
new_df = df1.vstack(df2)
# try to append in place
df1.extend(df2)
Run Code Online (Sandbox Code Playgroud)
要理解差异,重要的是要了解 Polars 内存是不可变的,iff
它有任何副本。
Polars 中的复制是免费的,因为它仅增加后备内存缓冲区的引用计数,而不是复制数据本身。
然而,如果内存缓冲区还没有副本,例如refcount == 1
,我们可以改变极坐标内存。
了解了这个背景,就有以下几种追加数据的方法:
concat
-> 连接所有给定的DataFrames
. 这是一种 的链接列表DataFrames
。如果您通过rechunk=True
,所有内存将被重新分配给连续的块。vstack
->通过增加引用计数来添加other
来自 的数据。DataFrame
这是超级便宜的。建议多次后调用rechunk vstacks
。或者简单地使用pl.concat
.extend
该操作复制数据。它尝试将数据从其他复制到DataFrame
. 然而,如果refcount
的DataFrame
大于1
。分配一个新的内存缓冲区来保存两者 DataFrames
。