如何在Python Polars中追加或连接两个数据帧?

问题描述 投票:0回答:2

我发现可以使用系列命名空间进行附加(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   │
└─────┴─────┴─────┘
python concatenation append python-polars
2个回答
42
投票

根据您的需求,有不同的

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

3
投票

看起来像 .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   │
└─────┴─────┴─────┘

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

© www.soinside.com 2019 - 2024. All rights reserved.