我有一个pl.DataFrame
包含整数列表的列。我需要断言每个连续整数最多连续出现两次。
例如,包含的列表[1,1,0,-1,1]
是可以的,因为数字 1 在一行中最多出现两次(前两个元素,后跟零)。
此列表应该会导致断言失败:[1,1,1,0,-1]
该数字1
连续出现三次。
这是一个玩具示例,应该row2
会导致断言失败。
import polars as pl
row1 = [0, 1, -1, -1, 1, 1, -1, 0]
row2 = [1, -1, -1, -1, 0, 0, 1, -1]
df = pl.DataFrame({"list": [row1, row2]})
print(f"row1: {row1}")
print(f"row2: {row2}")
print(df)
row1: [0, 1, -1, -1, 1, 1, -1, 0]
row2: [1, -1, -1, -1, 0, 0, 1, -1]
shape: (2, 1)
┌───────────────┐
│ list │
│ --- │
│ list[i64] │
╞═══════════════╡
│ [0, 1, … 0] │
│ [1, -1, … -1] │
└───────────────┘
可以使用以下内容。
使用 对列表进行游程编码
pl.Expr.rle
。这将生成一个结构列表。每个结构包含一个(唯一的)列表值和相应的游程长度。检查列表中的最大运行长度是否最多为 2。
bool
通过选择结果列表中的第一个(也是唯一的)元素(使用)来确保结果的类型pl.Expr.list.first
。pl.Expr.list.eval
通过分解列表可以避免在 中执行所有这些操作。然后,pl.Expr.over
需要一个窗口函数 ( ) 来确保为每个列表分别计算最大值。结果是一样的。
您肯定需要一种方法来连续检查数字并从那里过滤数据框。
类似于:
这将遍历列表并检查给定的字符是否重复超过 2 次,如果是,则返回 False。
从那里您可以决定如何处理失败的列表。
您还可以在这里找到其他解决方案。
与发电机一起使用
map_elements
并短路:输出: