问:如何在 python 极坐标中附加或连接两个数据帧?

Q: How can I append or concatenate two dataframes in python polars?

我发现可以使用系列命名空间 () 进行追加。我想知道是否有类似的方法来附加或连接数据帧。

pandas 历史上它可以用 df1.append(df2) 完成。但是,pd.concat([df1, df2]).

已弃用该方法(如果尚未弃用)

df1

a b c
1 2 3

df2

a b c
4 5 6

资源

a b c
1 2 3
4 5 6

看起来 .extend()df1 突变为 将其内存扩展 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   │
└─────┴─────┴─────┘

任何关于不太冗长的方法的反馈将不胜感激。

根据您的需要,有不同的 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 它有任何副本。

polars 中的副本是免费的,因为它只会增加后备内存缓冲区的引用计数,而不是复制数据本身。

但是,如果内存缓冲区还没有副本,例如refcount == 1,我们可以改变极地记忆。

了解了这一背景,有以下几种方法可以追加数据:

  • concat -> 连接所有给定的 DataFrames。这是一个 DataFrames 的链表。如果你传递 rechunk=True,所有内存将被重新分配给连续的块。
  • vstack -> 通过递增引用计数将数据从 other 添加到 DataFrame。这是超级便宜。建议在许多 vstacks 之后调用 rechunk。或者简单地使用 pl.concat.
  • extend 该操作复制数据。它试图将数据从 other 复制到 DataFrame。但是,如果 DataFramerefcount 大于 1。分配了一个新的内存缓冲区来保存 DataFrames.