如何在Polars中创建交叉表?验证列唯一组合统计写法
Polars统计两列唯一组合数量的实现
你的Polars写法能得到正确的计数结果,但输出结构和R的table()、Pandas的pd.crosstab()不一致。如果想要和R/Pandas对齐的行是a、列是b的交叉表,或者更简洁地统计唯一组合数量,可以参考以下实现方式:
方法1:调整pivot参数匹配R/Pandas输出结构
通过交换index和on的参数,得到和R、Pandas示例一致的交叉表格式:
import polars as pl df = pl.DataFrame( { "a": [2,0,1,0,0,0], "b": [1,1,1,0,0,1] } ) df.pivot(on="b", index="a", values="b", aggregate_function="len").fill_null(0)
输出结果:
shape: (3, 3) ┌─────┬─────┬─────┐ │ a ┆ 0 ┆ 1 │ │ --- ┆ --- ┆ --- │ │ i64 ┆ u32 ┆ u32 │ ╞═════╪═════╪═════╡ │ 2 ┆ 0 ┆ 1 │ │ 0 ┆ 2 ┆ 2 │ │ 1 ┆ 0 ┆ 1 │ └─────┴─────┴─────┘
方法2:直接分组统计唯一组合(更直观)
如果仅需要统计两列的唯一组合及其对应数量,不需要交叉表格式,使用groupby+count的方式更直接清晰:
df.group_by(["a", "b"], maintain_order=True).count()
输出结果:
shape: (4, 3) ┌─────┬─────┬───────┐ │ a ┆ b ┆ count │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ u32 │ ╞═════╪═════╪═══════╡ │ 2 ┆ 1 ┆ 1 │ │ 0 ┆ 1 ┆ 2 │ │ 1 ┆ 1 ┆ 1 │ │ 0 ┆ 0 ┆ 2 │ └─────┴─────┴───────┘
你的原代码逻辑是正确的,只是行列维度与R/Pandas的示例相反,调整参数后即可得到一致的交叉表;若不需要交叉表形式,分组统计的方式更贴合“统计唯一组合数量”的核心需求。
内容的提问来源于stack exchange,提问作者Esben Eickhardt
相关产品推荐
相关产品推荐

