如果你发现自己经常需要执行这类操作,可以构建一个函数,该函数接受一个DataFrame和某个表达式(该表达式应聚合并返回布尔类型,尽管没有执行检查来强制这一点)。
from numpy.random import default_rng
import polars as pl
from polars import selectors as cs
def column_filter(df, expr):
tmp = df.select(expr)
if isinstance(df, pl.LazyFrame):
tmp = tmp.collect()
status = tmp.rows()[0]
return pl.col(col for col, st in zip(df.columns, status) if st)
rng = default_rng(0)
df = (
pl.DataFrame(
rng.normal([[0, 1, 2, 3]], [[0, 1, 0, 2]], size=(100, 4)),
schema=[*'abcd']
)
.with_columns(e=rng.choice([*'WXYZ'], size=100))
)
print(
df.select(
column_filter(df, cs.numeric().std() > 0),
pl.col('e'),
),
sep='\n',
)
# shape: (100, 3)
# ┌───────────┬──────────┬─────┐
# │ b ┆ d ┆ e │
# │ --- ┆ --- ┆ --- │
# │ f64 ┆ f64 ┆ str │
# ╞═══════════╪══════════╪═════╡
# │ 0.867895 ┆ 3.2098 ┆ X │
# │ 1.361595 ┆ 4.894162 ┆ W │
# │ -0.265421 ┆ 3.082652 ┆ Z │
# │ 0.781208 ┆ 1.535465 ┆ Y │
# │ … ┆ … ┆ … │
# │ 0.512782 ┆ 1.759142 ┆ W │
# │ 1.367466 ┆ 2.039108 ┆ Z │
# │ 0.418967 ┆ 3.178112 ┆ Z │
# │ -0.095472 ┆ 3.887983 ┆ X │
# └───────────┴──────────┴─────┘
这带来的好处是将过滤后的列作为表达式返回,从而使你可以根据需要对子集进行操作并重新组合数据。