如何实现Polars数值类型列与支持__mul__方法的对象类型列相乘?
如何实现Polars数值类型列与支持__mul__方法的对象类型列相乘?
嘿,我来帮你搞定这个问题!看你的代码,你已经给Summary类实现了__mul__和__rmul__方法,现在就差让Polars把数值列和对象列的对应元素乘起来,对吧?
Polars里的object类型列没法直接和数值列做向量化乘法,得用map_elements来逐行处理每个元素——毕竟每个Summary都是独立的实例,得挨个调用它的乘法方法。
直接上可行的代码:
import polars as pl # 你的Summary类、mapping字典和df创建代码保持不变,直接用已有的df就行 result_df = df.with_columns( # 把要用到的两列打包成结构体,方便同时取到数值和对象实例 pl.struct(["quantity", "summary"]) .map_elements(lambda row: row["quantity"] * row["summary"]) .alias("quantity_times_summary") )
运行之后,你就能得到新增的乘积列了,结果大概是这样:
shape: (3, 4) ┌──────────┬───────┬───────────────┬─────────────────────────┐ │ quantity ┆ type ┆ summary ┆ quantity_times_summary │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ object ┆ object │ ╞══════════╪═══════╪═══════════════╪═════════════════════════╡ │ 7 ┆ CASH ┆ Summary(1,E) ┆ Summary(7,E) │ │ 4 ┆ ITEM ┆ Summary(-9,A) ┆ Summary(-36,A) │ │ 10 ┆ CHECK ┆ Summary(46,A) ┆ Summary(460,A) │ └──────────┴───────┴───────────────┴─────────────────────────┘
为啥这么写能行?因为你已经给Summary实现了__rmul__,当我们用「数值在前、对象在后」的方式做乘法时,会自动触发这个方法,刚好匹配你的需求。
要是你想直接替换原来的summary列,把alias的名字改成"summary"就行,这样就会覆盖原列的内容。
另外提一句:因为是处理object类型列,Polars没法做原生数值列那种底层优化,如果你的数据量特别大,性能可能会打折扣,但对于自定义对象的场景,这是最直接的实现方式啦。
备注:内容来源于stack exchange,提问作者Phil-ZXX
相关产品推荐
相关产品推荐

