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
相关产品推荐
相关产品推荐

