Polars 1.0.0中group_by_dynamic后len()懒模式可用但急模式报错
Polars 1.0.0:group_by_dynamic在懒/急模式下的len()方法差异
在Polars 1.0.0版本中,存在一个反常的API行为:对group_by_dynamic()的结果调用len()方法时,懒模式可以正常运行,但急模式会触发报错。
代码示例验证
懒模式(正常执行)
from datetime import datetime import polars as pl df = pl.DataFrame( { "time": pl.datetime_range( start=datetime(2024, 6, 30), end=datetime(2024, 7, 16), interval="1d", eager=True, ), } ).with_columns(n=pl.int_range(pl.len())) # 懒模式下调用len():正常输出 x = df.lazy().group_by_dynamic("time", every="1w").len(name="count").collect() print(x) # 输出结果: # shape: (4, 2) # ┌─────────────────────┬───────┐ # │ time ┆ count │ # │ --- ┆ --- │ # │ datetime[μs] ┆ u32 │ # ╞═════════════════════╪═══════╡ # │ 2024-06-24 00:00:00 ┆ 1 │ # │ 2024-07-01 00:00:00 ┆ 7 │ # │ 2024-07-08 00:00:00 ┆ 7 │ # │ 2024-07-15 00:00:00 ┆ 2 │ # └─────────────────────┴───────┘
急模式(触发报错)
# 急模式下调用len():报错 x = df.group_by_dynamic("time", every="1w").len(name="count") print(x) # 报错信息: # Traceback (most recent call last): # File "/Users/anto/src/poste/sda-poste-logistics/script/polars_bug_groupby_dynamic_len.py", line 26, in <module> # x = df.group_by_dynamic("time", every="1w").len(name="count") # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # AttributeError: 'DynamicGroupBy' object has no attribute 'len'
差异原因
这种不一致是Polars API设计的不对称性导致的:
- 懒模式返回的
LazyGroupByDynamic类封装了len()快捷方法,用于快速实现分组计数; - 而急模式返回的
DynamicGroupBy类并未提供这个快捷方法,必须通过标准的聚合语法来实现相同功能。
这类问题属于API一致性缺陷,后续版本大概率会修复,让急模式也支持直接调用len()。
急模式下的替代实现
如果需要在急模式下完成相同的分组计数,只能通过agg()方法配合pl.len()实现:
# 急模式下的正确写法 x = df.group_by_dynamic("time", every="1w").agg(counts=pl.len()) print(x)
内容的提问来源于stack exchange,提问作者user2304916
相关产品推荐
相关产品推荐

