Polars数据转换疑问:两类常见操作问题问询
问题1:如何仅对指定列执行除法操作
原代码使用pl.all()会对DataFrame的所有列执行除法,要仅针对a和c列操作,只需将pl.all()替换为指定列选择器pl.col(['a', 'c'])即可。
修改后的代码:
import polars as pl df = pl.DataFrame({'a':[3,3,3],'b':[6,6,9], 'c':[6,6,9]}) df = df.with_columns(pl.col(['a', 'c']) / 3.0)
执行后,a和c列会被转换为f64类型并完成除法计算,b列保持原类型和数值不变,完全匹配预期输出。
问题2:解决「TypeError: cannot convert Python type 'method' to Int64」错误
报错存在两个核心问题:
- 错误调用Duration属性:Polars中日期相减得到的
Duration类型,获取天数的正确属性是.dt.days,而非.dt.total_days(这是Pandas的用法)。原代码中.dt.total_days是未调用的方法引用,导致无法转换为Int64类型。 alias位置错误:alias('active')应该绑定在pl.when(...)的表达式末尾,用于给新增列命名;原代码将其放在with_columns()之后,会错误地给整个DataFrame改名,而非目标列。
修改后的正确代码:
import polars as pl from datetime import date data = { 'last_seen': [5, 20, 3, 8, 12], 'dates': [date(2023, 6, 20), date(2023, 5, 15), date(2023, 6, 27), date(2023, 6, 19), date(2023, 6, 10)] } df_polars = pl.DataFrame(data) today = date(2023, 6, 30) range_mask = ( (df_polars['last_seen'] >= -5) & ( (df_polars['last_seen'] < 15) | ( (df_polars['dates'] > today) & ((df_polars['dates'] - today).dt.days > (df_polars['last_seen'] - 15)) ) ) ) df_polars = df_polars.with_columns(pl.when(range_mask).then(True).otherwise(False).alias('active'))
修改后,Duration的天数获取逻辑正确,新增列会被正确命名为active,不再抛出类型错误。
内容的提问来源于stack exchange,提问作者Rade
相关产品推荐
相关产品推荐

