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

Python 3.7升级后dtype冲突致加权均值计算报错求助

Python 3.7中计算DataFrame加权均值触发TypeError的解决办法

嘿,我一眼就看出你这问题的症结了——你不小心把字符串类型的列卷进数值运算里了!Python 3.7之后numpy的类型检查变严格了,之前3.6里可能悄悄帮你做了隐式转换,现在直接给你报错了,咱们一步步来解决:

先搞懂错误原因

你收到的TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21')...里,<U21是字符串类型的标记,说明你的computeColumn函数里,df.iloc[:,offset+i]取到的是字符串列,你拿字符串去乘整数、做加法,这不报错才怪呢!

看你贴的DataFrame结构,前5列里就有两个object类型的字符串列(课程名称、学期),如果你的offset参数指向的是这些列,那肯定出问题。你说要计算“第1-5列的加权均值”,但这几列根本不全是数值型啊!

正确的解决步骤

1. 精准筛选要计算的数值列

首先得明确:你要计算的是每个问题下的5个评分列(比如问题2的Helt enig、各类Blank列、Helt uenig),这些才是int64类型的数值列。咱们别用列位置来选,用列名特征筛选更靠谱:

# 比如筛选问题2的所有评分列(排除那个Indgår(2)的字符串列)
target_cols = [col for col in df.columns if '(2)' in col and 'Indgår' not in col]
# 确保列是数值型,转成float避免后续运算问题
df_target = df[target_cols].astype(float)

2. 重写加权均值函数(用向量运算更高效)

别用循环啦,pandas和numpy的向量运算既快又不容易出错,还能避免类型问题:

import numpy as np
import pandas as pd

def compute_weighted_mean(df_target):
    # 对应5列的权重:5,4,3,2,1
    weights = np.array([5, 4, 3, 2, 1])
    # 计算加权总和
    weighted_sum = (df_target * weights).sum(axis=1)
    # 计算每一行的总和
    row_total = df_target.sum(axis=1)
    # 处理总和为0的情况,避免除以0报错,换成NaN
    weighted_mean = weighted_sum / row_total.replace(0, np.nan)
    return weighted_mean

3. 调用函数并整合结果

# 计算加权均值
problem2_mean = compute_weighted_mean(df_target)
# 把结果添加回原DataFrame
df['问题2_加权均值'] = problem2_mean

额外提醒

  • 永远不要依赖列位置(iloc[:,offset:offset+5])来选列,除非你能100%保证Excel文件的列顺序永远不变,不然很容易误选到字符串列;
  • 运算前一定要用df[target_cols].dtypes检查列类型,确保都是int64或float64;
  • 记得处理除以0的情况,不然遇到全0的行,会得到inf或者直接报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:36:40