You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:35:28