如何使用另一个dataframe来掩盖(polarmask)一个pandas dataframe?

3

我有一个类似这样的Polars数据框:

pl.DataFrame({
    'time': [datetime(2021, 10, 2, 0, 5), datetime(2021, 10, 2, 0, 10)],
    '1': [2.9048, 48224.0],
    '2': [2.8849, 48068.0]
})

以类似的列和时间值创建掩码数据框:

pl.DataFrame({
    'time': [datetime(2021, 10, 2, 0, 5), datetime(2021, 10, 2, 0, 10)],
    '1': [False, True],
    '2': [False, True]
})

我需要这个结果:

pl.DataFrame({
    'time': [datetime(2021, 10, 2, 0, 5), datetime(2021, 10, 2, 0, 10)],
    '1': [None, 2.8849],
    '2': [None, 48068.0],
})

这里只展示了2列“1”和“2”,但实际上可能有任意数量的列。

非常感谢您的帮助!

1个回答

2
在一个单独的DataFrame中拥有列,可以保证你在将数据分开存储时所没有的内容。通过另一个DataFrame的列来屏蔽值,会因长度不同而潜在地导致错误。因此,polars不鼓励这样的操作,你必须先从两个表中创建一个单独的DataFrame,然后选择你需要的列/计算。所以让我们开始吧。首先,你可以连接(join)这两个表,这可以确保在不同大小的DataFrame上工作。
df_a.join(df_mask, on="time", suffix="_mask")

然而,这需要付出代价,因为加入不是免费的。

如果您确信您的数据框具有相同的高度,您可以使用水平 concat

(
    pl.concat(
        [df_a, df_mask.select(pl.all().suffix("_mask"))], how="horizontal"
    ).select(
        [pl.col("time")]
        + [
            pl.when(pl.col(f"{name}_mask")).then(pl.col(name)).otherwise(None)
            for name in ["1", "2"]
        ]
    )
)

在最终的select查询中,我们选择我们想要的列,并使用when -> then -> otherwise分支计算掩码值。
这将输出:
shape: (2, 3)
┌─────────────────────┬─────────┬─────────┐
│ time                ┆ 12       │
│ ---                 ┆ ---     ┆ ---     │
│ datetime[μs]        ┆ f64     ┆ f64     │
╞═════════════════════╪═════════╪═════════╡
│ 2021-10-02 00:05:00 ┆ null    ┆ null    │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
│ 2021-10-02 00:10:0048224.048068.0 │
└─────────────────────┴─────────┴─────────┘


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接