问:如何在 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
。但是,如果 DataFrame
的 refcount
大于 1
。分配了一个新的内存缓冲区来保存 DataFrames
.
我发现可以使用系列命名空间 (
在 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
。但是,如果DataFrame
的refcount
大于1
。分配了一个新的内存缓冲区来保存DataFrames
.