tho*_*era 2 python dataframe python-polars
我想将多个DataFrames不同形状的添加在一起。
在添加 之前DataFrames,我们的想法是通过添加缺失的行(使用“索引”列作为参考)和缺失的列(用 0 填充)来重塑它们。
以下是输入的示例:
\nimport 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)\nRun Code Online (Sandbox Code Playgroud)\n预期结果是:
\nshape: (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\nRun Code Online (Sandbox Code Playgroud)\n列的顺序不是问题。
\n这是一个解决方案,但看起来有点笨拙:
\nfrom 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])\nRun Code Online (Sandbox Code Playgroud)\n
pl.concat([a, b, c], how="diagonal").groupby("index", maintain_order=True).sum()\nRun Code Online (Sandbox Code Playgroud)\nshape: (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\nRun Code Online (Sandbox Code Playgroud)\n