我有两组数据集:
第一个描述了我的期望:
expected = {
"name": ["start", "stop", "start", "stop", "start", "stop", "start", "stop"],
"description": ["a", "b", "c", "d", "e", "f", "g", "h"],
}
第二段描述了我的观察:
observed = {
"name": ["start", "stop", "start", "stop", "stop", "stop", "start"],
"time": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7],
}
我想根据我期望的顺序将我的所有观察结果与描述进行匹配。但是一旦发现不一致,就什么都不能匹配了。
我设法找到了第一个不一致之处,例如:
observed_df = pl.DataFrame(observed).with_row_index()
expected_df = pl.DataFrame(expected).with_row_index()
result = observed_df.join(expected_df, on=["index", "name"], how="left").select(
"description", "time"
)
"""
┌─────────────┬──────┐
│ description ┆ time │
│ --- ┆ --- │
│ str ┆ f64 │
╞═════════════╪══════╡
│ a ┆ 0.1 │
│ b ┆ 0.2 │
│ c ┆ 0.3 │
│ d ┆ 0.4 │
│ null ┆ 0.5 │ -> First inconsistency gets a "null" description
│ f ┆ 0.6 │
│ g ┆ 0.7 │
└─────────────┴──────┘
"""
我怎样才能传播这个null
通过第一个不一致的情况?
此外,我的真实数据还有一个附加id
列,其中每个列id
都是如上所述的情况,并且独立于其他id
列。是否可以以某种方式“按 ID 分组”并一次性应用此逻辑,而不是id
分别处理每个逻辑:
observed = {
"id": [1, 2, 1, 2, 2],
"name": ["start", "start", "stop", "stop", "stop"],
"time": [0.1, 0.2, 0.3, 0.4, 0.5],
}
expected = {
"id": [1, 1, 2, 2],
"name": ["start", "stop", "start", "stop"],
"description": ["a", "b", "c", "d"],
}
result = {
"id": [1, 2, 1, 2, 2],
"description": ["a", "c", "b", "d", None],
"time": [0.1, 0.2, 0.3, 0.4, 0.5],
}
可以使用累积评估来检查在增加的窗口中是否出现任何空值,例如
pl.Expr.cum_sum
。可以使用when-then-otherwise构造来相应地传播空值。
在您的示例中,可能看起来如下所示。
如果您想对 定义的每个组分别评估此表达式,则可以使用
id
窗口函数,例如。pl.Expr.over