为何从Pandas移植至Polars的代码无法正常运行?
Polars 替代 Pandas 代码的正确实现
问题分析
你当前的Polars代码存在两处关键错误:
- 计算日期差时错误将数值类型的
reorder_threshold转为Date类型,应该用时长(Duration)来做日期减法 - 直接引用DataFrame列而非使用Polars表达式风格,不符合其API设计逻辑
修正后的完整代码
import polars as pl data = { 'transaction_date': ['2023-06-01', '2023-06-02', '2023-06-03'], 'quantity_available': [0, 2, 1], 'reorder_threshold': [5, 1, 3], 'current_price': [10.0, 12.0, 8.0], 'sold_price': [0.0, 15.0, 20.0], } # 初始化DataFrame并将日期列转为Date类型 df_product_data = pl.DataFrame(data).with_columns( pl.col("transaction_date").str.to_date().alias("transaction_date") ) # 构建筛选掩码(推荐用表达式风格) product_sold_out_mask = ( (pl.col("quantity_available") == 0) & (pl.col("reorder_threshold") >= 0) ) # 计算sold_out_date df_product_data = df_product_data.with_columns( pl.when(product_sold_out_mask) .then(pl.col("transaction_date") - pl.duration(days=pl.col("reorder_threshold"))) .otherwise(pl.lit(None, dtype=pl.Date)) .alias("sold_out_date") ) # 修正sold_price字段 df_product_data = df_product_data.with_columns( pl.when(pl.col("sold_price") <= 0) .then(pl.lit(-999.0)) .when(pl.col("sold_price") > 2.0 * pl.col("current_price")) .then(pl.col("current_price")) .otherwise(pl.col("sold_price")) .alias("sold_price") ) print(df_product_data)
关键修正点说明
- 日期处理:用
pl.duration(days=pl.col("reorder_threshold"))将数值转为天数时长,再与日期列做减法,这是Polars中日期偏移的正确方式 - 表达式风格:全程使用
pl.col()引用列,而非直接从DataFrame取列,Polars会对表达式做优化,提升性能 - 类型明确:
otherwise(pl.lit(None, dtype=pl.Date))明确指定空值类型为Date,避免类型推断问题 - 数值类型统一:
pl.lit(-999.0)用浮点型,保证与原sold_price类型一致
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

