含NaN的DataFrames条件式逐元素乘法实现
问题:DataFrame逐元素乘法的NaN控制需求
现有DataFrame定义
DataFrame A
| 0 | 1 | 2 |
|---|---|---|
| 0 | 0.5 | 0 |
| 0.1 | 0 | 0.2 |
| 0.2 | 0 | 0 |
DataFrame B
| 0 |
|---|
| 1.0 |
| 1.0 |
| NaN |
需求说明
需要将A的每一行与B进行逐元素乘法,但仅在原A的元素为0时才显示NaN,非0元素需保留正常相乘结果。
当前尝试及结果
执行代码:
A * B.transpose()
得到的结果:
| 0 | 1 | 2 |
|---|---|---|
| 0 | 0.5 | NaN |
| 0.1 | 0 | NaN |
| 0.2 | 0 | NaN |
但实际需要的结果是:
| 0 | 1 | 2 |
|---|---|---|
| 0 | 0.5 | NaN |
| 0.1 | 0 | 0.2 |
| 0.2 | 0 | NaN |
代码定义
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())
执行后得到的结果:
| 0 | 1 | 2 |
|---|---|---|
| 0.0 | 0.5 | 0.0 |
| 0.1 | 0.0 | 0.2 |
| 0.2 | NaN | NaN |
若需要完全匹配你给出的预期结果(第一行第三列的0显示为NaN),则说明需求是原A元素为0时,无论B对应值是什么都显示NaN,只需修改掩码条件:
result_df = temp.mask(A == 0)
内容的提问来源于stack exchange,提问作者user280809
相关产品推荐
相关产品推荐

