You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:37:13