Numpy与Pandas向量化运算不一致:pd.DataFrame行除行和结果异常求解
Pandas与Numpy向量化运算的差异及行归一化解决方案
核心差异原因
二者向量化运算的匹配逻辑完全不同:
- Pandas的二元运算优先按索引/列名对齐,维度广播是索引对齐之后的次要逻辑
- Numpy的二元运算没有索引概念,直接按数组维度规则广播
你的Pandas代码出错、出现额外列的原因
你通过np.sum(df, axis=1)得到的rowSum是一个长度为100的Series对象,索引为df的行号[0,1,...,99]。
当直接执行df / rowSum时,Pandas默认会将Series的索引与DataFrame的列名对齐:
- df只有5个列,列名为
[0,1,2,3,4],仅能和rowSum索引的前5个值匹配 rowSum剩下的索引5~99在df中无对应列,会自动生成95个新列,值全部为NaN- 仅有的5个匹配列的计算逻辑也完全错误:每列的所有行值都除以
rowSum中对应该列名的单个值,而非每行除以自身行的总和
正确的Pandas向量化实现
不需要转numpy数组也不需要用apply,直接调用Pandas的div方法,指定按行对齐即可:
import pandas as pd import numpy as np # 测试数据 df = pd.DataFrame(np.random.randint(0, 100, size=(100, 5))) rowSum = df.sum(axis=1) # 正确的行归一化写法,axis=0表示按行维度对齐运算 divided = df.div(rowSum, axis=0)
Numpy运算逻辑说明
Numpy没有索引对齐机制,完全按维度广播规则运算:
- df转为(100, 5)的二维数组,
rowSum转为(100, 1)的二维数组后 - 运算时Numpy自动将(100, 1)的后一个维度广播为5,每行的所有元素都除以该行对应的总和,因此结果符合预期
内容的提问来源于stack exchange,提问作者John Sorensen
相关产品推荐
相关产品推荐

