我发现可以使用系列命名空间进行附加(https://stackoverflow.com/a/70599059/5363883)。我想知道是否有类似的方法来附加或连接 DataFrame。
在
pandas
历史上可以用 df1.append(df2)
来完成。然而,该方法已被弃用(如果尚未被弃用)pd.concat([df1, df2])
。
示例框架:
df1 = pl.from_repr("""
┌─────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1 ┆ 2 ┆ 3 │
└─────┴─────┴─────┘
""")
df2 = pl.from_repr("""
┌─────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 4 ┆ 5 ┆ 6 │
└─────┴─────┴─────┘
""")
想要的结果:
shape: (2, 3)
┌─────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1 ┆ 2 ┆ 3 │
│ 4 ┆ 5 ┆ 6 │
└─────┴─────┴─────┘
根据您的需求,有不同的
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)
要了解差异,重要的是要了解 Polars 内存是不可变的
iff
它有任何副本。
极性中的复制是免费的,因为它仅增加后备内存缓冲区的引用计数,而不是复制数据本身。
但是,如果内存缓冲区还没有副本,例如
refcount == 1
,我们可以改变极地记忆。
了解了这个背景就有以下几种追加数据的方法:
concat
-> 连接所有给定的 DataFrames
。这是一个 DataFrames
的链接列表。如果通过 rechunk=True
,所有内存将被重新分配到连续的块。vstack
-> 通过增加引用计数将数据从 other
添加到 DataFrame
。这是超级便宜的。建议多次vstacks
后调用rechunk。或者直接使用 pl.concat
。extend
此操作复制数据。它尝试将数据从其他复制到 DataFrame
。然而,如果 refcount
的 DataFrame
大于 1
。分配一个新的内存缓冲区来容纳 DataFrames
。看起来像 .extend() 将
df1
变异为 extend 其内存为 df2
。
import polars as pl
df1 = pl.DataFrame({"a": [1], "b": [2], "c": [3]})
df2 = pl.DataFrame({"a": [4], "b": [5], "c": [6]})
df1.extend(df2)
┌─────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1 ┆ 2 ┆ 3 │
│ 4 ┆ 5 ┆ 6 │
└─────┴─────┴─────┘
这是有道理的,但如果我想创建一个完全不同的(在内存中也是如此)
df3
我猜它会是
import polars as pl
df1 = pl.DataFrame({"a": [1], "b": [2], "c": [3]})
df2 = pl.DataFrame({"a": [4], "b": [5], "c": [6]})
df3 = pl.from_records(df1.to_numpy(), columns=["a", "b", "c"])
df3.extend(df2)
┌─────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1 ┆ 2 ┆ 3 │
│ 4 ┆ 5 ┆ 6 │
└─────┴─────┴─────┘
任何关于不太冗长的方法的反馈将不胜感激。