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

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的列名对齐:

  1. df只有5个列,列名为[0,1,2,3,4],仅能和rowSum索引的前5个值匹配
  2. rowSum剩下的索引5~99在df中无对应列,会自动生成95个新列,值全部为NaN
  3. 仅有的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:36:08