Polars使用is_in()过滤duration类型数据时触发类型错误求助
解决Polars中duration类型列使用is_in()多值筛选的报错问题
先看你的DataFrame构造代码:
import polars as pl df = pl.DataFrame({ "duration_m": [5, 15, 30] }) df = df.with_columns( duration = pl.duration(minutes = pl.col("duration_m")) )
当你尝试用is_in()传入多个duration对象的列表时触发报错:
my_durations = [pl.duration(minutes=5), pl.duration(minutes=15)] df.filter(pl.col("duration").is_in(my_durations))
TypeError: not yet implemented: Nested object types
Hint: Try settingstrict=Falseto allow passing data with mixed types.
这是因为Polars目前还不支持直接将多个duration对象组成的Python列表传入is_in(),但可以通过以下几种方法解决:
方法1:转换为纳秒数值进行筛选
利用duration类型底层以纳秒存储的特性,将列和筛选目标都转成纳秒数值:
# 把目标duration转成纳秒数值 my_durations_ns = [ pl.duration(minutes=5).total_nanoseconds(), pl.duration(minutes=15).total_nanoseconds() ] # 筛选时将duration列也转成纳秒数值后匹配 result = df.filter(pl.col("duration").dt.total_nanoseconds().is_in(my_durations_ns)) print(result)
方法2:用Polars Series包装筛选列表
把多个duration对象放到Polars Series中再传入is_in(),Polars就能正确识别类型:
my_durations_series = pl.Series([pl.duration(minutes=5), pl.duration(minutes=15)]) result = df.filter(pl.col("duration").is_in(my_durations_series)) print(result)
方法3:直接基于原始列筛选(最简便)
既然duration列是从duration_m生成的,直接筛选原始的分钟数值列更简单高效:
result = df.filter(pl.col("duration_m").is_in([5, 15])) print(result)
以上三种方法都能得到你想要的筛选结果:
shape: (2, 2) ┌────────────┬──────────────┐ │ duration_m ┆ duration │ │ --- ┆ --- │ │ i64 ┆ duration[ns] │ ╞════════════╪══════════════╡ │ 5 ┆ 5m │ │ 15 ┆ 15m │ └────────────┴──────────────┘
内容的提问来源于stack exchange,提问作者Wouter De Raeve
相关产品推荐
相关产品推荐

