我有一个简单的pl.DataFrame
,其中有许多列仅包含布尔值。
import polars as pl
df = pl.DataFrame(
{"s1": [True, True, False], "s2": [False, True, True], "s3": [False, False, False]}
)
shape: (3, 3)
┌───────┬───────┬───────┐
│ s1 ┆ s2 ┆ s3 │
│ --- ┆ --- ┆ --- │
│ bool ┆ bool ┆ bool │
╞═══════╪═══════╪═══════╡
│ true ┆ false ┆ false │
│ true ┆ true ┆ false │
│ false ┆ true ┆ false │
└───────┴───────┴───────┘
我需要添加另一个包含不同长度列表的列。任何单个行中的列表都应包含列名,其中 、 和 列的S1
值s2
都有s3
值True
。
这是我真正在寻找的:
shape: (3, 4)
┌───────┬───────┬───────┬──────────────┐
│ s1 ┆ s2 ┆ s3 │ list │
│ --- ┆ --- ┆ --- │ --- │
│ bool ┆ bool ┆ bool │ list[str] │
╞═══════╪═══════╪═══════╡══════════════╡
│ true ┆ false ┆ false │ ["s1"] │
│ true ┆ true ┆ false │ ["s1", "s2"] │
│ false ┆ true ┆ false │ ["s2"] │
└───────┴───────┴───────┴──────────────┘
您可以建立一个 when/then 表达式列表,然后删除空值。
或者
.list.eval()
首先,您可以使用 创建所有列的结构
struct
,然后可以使用map_elements
为每一行应用 lambda 函数。col
如果其对应值为val
True,lambda 函数将创建一个包含列名的列表推导。然后使用 为新列使用别名list
。或者你可以这样做
打印(所需输出)
您可以
melt
、filter
、group_by.agg
和join
:输出: