Python pandas实现列值与行数据相乘 解决结果大量NaN问题
问题根源
- pandas执行
*算术运算时默认会按行索引、列索引双对齐,只有两边索引完全匹配的单元格才会计算,索引不匹配的位置直接返回NaN。 - 你代码里的
df2.transpose()是无效操作:一维Series不存在行列维度的区别,转置后还是长度为9的一维结构,根本不是你预期的1行9列二维数组,自然没法触发你想要的广播乘法。小数据集下偶尔计算正确,只是刚好部分索引碰巧匹配,不是写法本身正确。
可直接复用的正确写法
优先选第一种,大数据集下性能最高,也不会触发索引对齐导致的NaN问题:
写法1:直接调用底层numpy数组做广播运算(推荐)
绕开pandas的索引对齐逻辑,直接用numpy原生广播实现逐元素相乘,速度最快:
import pandas as pd days = [1, 2, 3] time = [2, 4, 2, 4, 2, 4, 2, 4, 2] df1 = pd.DataFrame(days) s2 = pd.Series(time) # 3行1列的数组乘长度9的一维数组,numpy自动广播为3行9列 df3 = pd.DataFrame(df1.to_numpy() * s2.to_numpy())
写法2:显式调整维度后运算
如果你需要保留pandas对象的索引,手动给一维列数据增加维度后再计算:
import pandas as pd import numpy as np days = [1, 2, 3] time = [2, 4, 2, 4, 2, 4, 2, 4, 2] s1 = pd.Series(days) s2 = pd.Series(time) # 给s1增加列维度,从(3,)变成(3,1),和(9,)的s2运算时自动广播 df3 = pd.DataFrame(s1.to_numpy()[:, np.newaxis] * s2.to_numpy())
运行结果
两种写法输出的df3完全匹配你的预期:
0 1 2 3 4 5 6 7 8 0 2 4 2 4 2 4 2 4 2 1 4 8 4 8 4 8 4 8 4 2 6 12 6 12 6 12 6 12 6
提示:如果你的原始数据带自定义索引,运算前可以先把索引保存下来,算完再赋值回结果DataFrame即可,不要直接拿带不匹配索引的pandas对象直接做乘法。
内容的提问来源于stack exchange,提问作者JakeP
相关产品推荐
相关产品推荐

