如何在极坐标中添加多个具有不同形状的DataFrame?

tho*_*era 2 python dataframe python-polars

我想将多个DataFrames不同形状的添加在一起。

\n

在添加 之前DataFrames,我们的想法是通过添加缺失的行(使用“索引”列作为参考)和缺失的列(用 0 填充)来重塑它们。

\n

以下是输入的示例:

\n
import polars as pl\n\na = pl.DataFrame(\n    data={"index": [1, 2, 3], "col_1": [1, 0, 0], "col_2": [1, 1, 1]}\n)\n\nb = pl.DataFrame(\n    data={"index": [1, 2, 3], "col_1": [1, 1, 1], "col_2": [1, 1, 1]}\n)\n\nc = pl.DataFrame(\n    data={"index": [1, 4, 5], "col_1": [10, 10, 10], "col_3": [1, 1, 1]}\n)\n
Run Code Online (Sandbox Code Playgroud)\n

预期结果是:

\n
shape: (5, 4)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 index \xe2\x94\x86 col_1 \xe2\x94\x86 col_2 \xe2\x94\x86 col_3 \xe2\x94\x82\n\xe2\x94\x82 ---   \xe2\x94\x86 ---   \xe2\x94\x86 ---   \xe2\x94\x86 ---   \xe2\x94\x82\n\xe2\x94\x82 i64   \xe2\x94\x86 i64   \xe2\x94\x86 i64   \xe2\x94\x86 i64   \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1     \xe2\x94\x86 12    \xe2\x94\x86 2     \xe2\x94\x86 1     \xe2\x94\x82\n\xe2\x94\x82 2     \xe2\x94\x86 1     \xe2\x94\x86 2     \xe2\x94\x86 0     \xe2\x94\x82\n\xe2\x94\x82 3     \xe2\x94\x86 1     \xe2\x94\x86 2     \xe2\x94\x86 0     \xe2\x94\x82\n\xe2\x94\x82 4     \xe2\x94\x86 10    \xe2\x94\x86 0     \xe2\x94\x86 1     \xe2\x94\x82\n\xe2\x94\x82 5     \xe2\x94\x86 10    \xe2\x94\x86 0     \xe2\x94\x86 1     \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

列的顺序不是问题。

\n

这是一个解决方案,但看起来有点笨拙:

\n
from functools import reduce\n\ncolumns = set()\n\nfor df in [a, b, c]:\n    for column in df.columns:\n        columns.add(column)\n\nreshaped_df = []\n\nfor df in [a, b, c]:\n    for column in columns:\n        if column not in df.columns:\n            df = df.with_columns(pl.lit(0).alias(column))\n            reshaped_df.append(df)\n\nreshaped_df = pl.align_frames(*reshaped_df, on="index", select=columns)\n\nindex = reshaped_df[0].select("index").to_series()\n\nresult = reduce(\n    lambda a, b: a.select(pl.exclude("index").fill_null(value=0)) + b.select(pl.exclude("index").fill_null(value=0)),\n    reshaped_df).hstack([index])\n
Run Code Online (Sandbox Code Playgroud)\n

jqu*_*ous 6

还有pl.concat(how="diagonal")

\n
pl.concat([a, b, c], how="diagonal").groupby("index", maintain_order=True).sum()\n
Run Code Online (Sandbox Code Playgroud)\n
shape: (5, 4)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 index \xe2\x94\x86 col_1 \xe2\x94\x86 col_2 \xe2\x94\x86 col_3 \xe2\x94\x82\n\xe2\x94\x82 ---   \xe2\x94\x86 ---   \xe2\x94\x86 ---   \xe2\x94\x86 ---   \xe2\x94\x82\n\xe2\x94\x82 i64   \xe2\x94\x86 i64   \xe2\x94\x86 i64   \xe2\x94\x86 i64   \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1     \xe2\x94\x86 12    \xe2\x94\x86 2     \xe2\x94\x86 1     \xe2\x94\x82\n\xe2\x94\x82 2     \xe2\x94\x86 1     \xe2\x94\x86 2     \xe2\x94\x86 null  \xe2\x94\x82\n\xe2\x94\x82 3     \xe2\x94\x86 1     \xe2\x94\x86 2     \xe2\x94\x86 null  \xe2\x94\x82\n\xe2\x94\x82 4     \xe2\x94\x86 10    \xe2\x94\x86 null  \xe2\x94\x86 1     \xe2\x94\x82\n\xe2\x94\x82 5     \xe2\x94\x86 10    \xe2\x94\x86 null  \xe2\x94\x86 1     \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n