如何访问Polars中value_counts生成的struct中的值?
Polars中提取单个值计数及Struct访问的简便方法
问题背景
假设我们有如下Polars DataFrame:
import polars as pl df = pl.DataFrame({ "color": ["red", "blue", "red", "green", "blue", "blue"] })
在Pandas中,要获取color为'red'的计数可以直接这么写:
df.to_pandas()["color"].value_counts()["red"] # 输出:2
但在Polars里,value_counts()会生成包含Struct类型列的DataFrame:
df.select(pl.col("color").value_counts())
输出结果:
shape: (3, 1) ┌─────────────┐ │ color │ │ --- │ │ struct[2] │ ╞═════════════╡ │ {"red",2} │ │ {"blue",3} │ │ {"green",1} │ └─────────────┘
虽然可以通过unnest拆分列后提取值,或者用group_by('color').len()替代,但这些写法都比较繁琐。下面介绍更简便的实现方式。
一、提取单个计数值的简便方法
1. 直接筛选后取行数(最推荐)
如果只需要单个值的计数,完全不需要先统计所有值的频次,直接筛选目标行后取行数即可,代码简洁且效率更高:
# 方法1:用DataFrame的height属性 df.filter(pl.col("color") == "red").height # 输出:2 # 方法2:用len()函数 len(df.filter(pl.col("color") == "red")) # 输出:2
2. 基于value_counts的简化写法
如果已经使用了value_counts(),可以直接通过Struct字段访问,无需unnest:
# 写法1:用struct.field() (df.select(pl.col("color").value_counts()) .filter(pl.col("color").struct.field("color") == "red") .select(pl.col("color").struct.field("count")) .item()) # 输出:2 # 写法2:用索引语法,更简洁 target_count = df.select(pl.col("color").value_counts()).filter(pl.col("color").struct["color"] == "red").item() print(target_count["count"]) # 输出:2
二、通用的Polars Struct值访问方法
Polars提供了多种访问Struct类型字段的方式:
- 在表达式中访问:
- 使用
.struct.field("字段名"):适合在查询语句中调用,语义清晰pl.col("struct_column").struct.field("field_name") - 使用索引语法
.struct["字段名"]:和Python字典访问逻辑一致,写法更简洁pl.col("struct_column").struct["field_name"]
- 使用
- 提取单个Struct元素后访问:
如果已经通过.item()或.to_dict()取出了Struct对象,可以直接像字典一样访问字段:struct_item = df.select(pl.col("color").value_counts()).item() print(struct_item["color"]) # 输出:'red' print(struct_item["count"]) # 输出:2
内容的提问来源于stack exchange,提问作者user19077881
相关产品推荐
相关产品推荐

