如何将Pandas筛选赋值逻辑转换为Polars实现?
Pandas转Polars:条件更新列值的正确实现
原Pandas代码功能
这段Pandas代码用于筛选满足p23>z、posn>1、ncL>y条件的行,并将这些行的tradeL列值设为1:
self.df.loc[ (self.df['p23'] > z) & (self.df['posn'] > 1) & (self.df['ncL'] > y) , 'tradeL'] = 1
正确的Polars实现代码
对应功能的Polars代码需要使用with_columns结合when/then/otherwise语法,确保非匹配条件的行保留原tradeL值:
self.df = self.df.with_columns( pl.when( (pl.col("p23") > z) & (pl.col("posn") > 1) & (pl.col("ncL") > y) ).then(1).otherwise(pl.col("tradeL")).alias("tradeL") )
错误写法说明
你尝试的写法存在两个核心问题:
- 使用
select操作错误:select用于选择列,而非修改或替换列值,正确操作应使用with_columns then子句语法错误:then中需直接传入目标值(此处为1),而非赋值语句dfOut["tradeL"]=1
示例数据结构
对应的表结构示例:
┌────────────┬──────────┬──────────┬──────┬─────┬─────┬─────┬────────┬────────┐ │ tms ┆ p23 ┆ m23 ┆ posn ┆ ... ┆ ncL ┆ ncS ┆ tradeL ┆ tradeS │ │ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ f64 ┆ i64 ┆ ┆ i32 ┆ i32 ┆ i64 ┆ i64 │ ╞════════════╪══════════╪══════════╪══════╪═════╪═════╪═════╪════════╪════════╡ │ 1667551500 ┆ 3.582475 ┆ 0.654813 ┆ 23 ┆ ... ┆ 16 ┆ 0 ┆ 0 ┆ 0 │ │ 1672989300 ┆ 2.727239 ┆ 1.510049 ┆ 31 ┆ ... ┆ 3 ┆ 3 ┆ 0 ┆ 0 │ │ 1673215200 ┆ 0.0 ┆ 0.0 ┆ 0 ┆ ... ┆ 0 ┆ 0 ┆ 0 ┆ 0 │ │ 1665506700 ┆ 0.236804 ┆ 4.000484 ┆ 0 ┆ ... ┆ 0 ┆ 26 ┆ 0 ┆ 0 │ │ ... ┆ ... ┆ ... ┆ ... ┆ ... ┆ ... ┆ ... ┆ ... ┆ ... │ │ 1669979700 ┆ 0.437209 ┆ 3.800079 ┆ 6 ┆ ... ┆ 0 ┆ 13 ┆ 0 ┆ 0 │ │ 1669709700 ┆ 2.204868 ┆ 2.03242 ┆ 10 ┆ ... ┆ 12 ┆ 5 ┆ 0 ┆ 0 │ │ 1671648300 ┆ 3.27545 ┆ 0.961838 ┆ 30 ┆ ... ┆ 10 ┆ 0 ┆ 0 ┆ 0 │ │ 1668403800 ┆ 0.0 ┆ 0.0 ┆ 0 ┆ ... ┆ 0 ┆ 0 ┆ 0 ┆ 0 │ └────────────┴──────────┴──────────┴──────┴─────┴─────┴─────┴────────┴────────┘
内容的提问来源于stack exchange,提问作者Milan CDCDCD
相关产品推荐
相关产品推荐

