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

含NaN的DataFrames条件式逐元素乘法实现

问题:DataFrame逐元素乘法的NaN控制需求

现有DataFrame定义

DataFrame A

012
00.50
0.100.2
0.200

DataFrame B

0
1.0
1.0
NaN

需求说明

需要将A的每一行与B进行逐元素乘法,但仅在原A的元素为0时才显示NaN,非0元素需保留正常相乘结果。

当前尝试及结果

执行代码:

A * B.transpose()

得到的结果:

012
00.5NaN
0.10NaN
0.20NaN

但实际需要的结果是:

012
00.5NaN
0.100.2
0.20NaN

代码定义

import pandas as pd
import numpy as np

A = pd.DataFrame([[0, 0.5, 0], 
                  [0.1, 0, 0.2], 
                  [0.2, 0, 0]])

B = pd.DataFrame([1, 1, np.NaN])

解决方案

当前代码使用B.transpose()后,A的每一行会与B转置后的整行(1行3列)逐元素相乘,导致A第三列的所有元素都乘以B第三行的NaN,因此第二行第三列的0.2被转为NaN,不符合预期。

根据你的预期结果,核心需求应为:A的每个元素与B对应行的元素相乘(广播B为列向量),仅当原A元素为0且对应行B是NaN时,结果显示NaN,非0元素正常保留相乘结果,原A为0但对应行B非NaN时保留0。

实现代码

# 按行广播B,与A逐元素相乘
temp = A.mul(B, axis=0)
# 仅在原A为0且对应行B是NaN的位置设置为NaN
result_df = temp.mask((A == 0) & B.isna())

执行后得到的结果:

012
0.00.50.0
0.10.00.2
0.2NaNNaN

若需要完全匹配你给出的预期结果(第一行第三列的0显示为NaN),则说明需求是原A元素为0时,无论B对应值是什么都显示NaN,只需修改掩码条件:

result_df = temp.mask(A == 0)

内容的提问来源于stack exchange,提问作者user280809

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:07:01