绘制奥迪等品牌汽车每英里转速箱线图时遇UFuncTypeError错误求助
问题描述
尝试为奥迪(Audi)、现代(Hyundai)、铃木(Suzuki)和丰田(Toyota)四个汽车品牌绘制每英里转速(Rev.per.mile)的箱线图时,遇到以下错误:
UFuncTypeError: ufunc 'add' did not contain a loop with signature matching types (dtype('<U4'), dtype('int64')) -> None
使用的代码如下:
car_data_1 = car_data[(car_data["Manufacturer"] == "Audi") | (car_data["Manufacturer"] == "Hyundai") | (car_data["Manufacturer"] == "Suzuki") | (car_data["Manufacturer"] == "Toyota")] plt.boxplot(car_data_1.groupby("Manufacturer")["Rev.per.mile"], labels=["Audi", "Hyundai", "Suzuki", "Toyota"]) plt.title("Revs per mile for Audi, Hyundai, Suzuki and Toyota cars") plt.xlabel("Car Manufacturer") plt.ylabel("Revs per mile") plt.show()
已尝试修改数据类型,但仍出现相同错误。
解决方案
问题根源
plt.boxplot需要接收数值数组/列表的序列作为输入,直接传入pandas的GroupBy对象会触发类型不兼容的运算错误;Rev.per.mile列大概率存在字符串类型数据(比如包含非数字字符),导致和整数类型运算时类型不匹配。
修复步骤
1. 清洗并转换数据类型
先处理Rev.per.mile列的格式问题,将其转为数值类型并剔除无效值:
import pandas as pd import matplotlib.pyplot as plt # 转换Rev.per.mile为数值类型,无法转换的设为NaN car_data["Rev.per.mile"] = pd.to_numeric(car_data["Rev.per.mile"], errors="coerce") # 删除含空值的行 car_data = car_data.dropna(subset=["Rev.per.mile"])
2. 提取分组数据并绘制箱线图
筛选目标品牌后,提取每个品牌的转速数值列表传入boxplot:
target_brands = ["Audi", "Hyundai", "Suzuki", "Toyota"] # 筛选目标品牌数据 car_data_1 = car_data[car_data["Manufacturer"].isin(target_brands)] # 提取每个品牌的转速数据数组 grouped_data = [ car_data_1[car_data_1["Manufacturer"] == brand]["Rev.per.mile"].values for brand in target_brands ] # 绘制箱线图 plt.boxplot(grouped_data, labels=target_brands) plt.title("各品牌车辆每英里转速对比") plt.xlabel("汽车品牌") plt.ylabel("每英里转速") plt.show()
也可以通过GroupBy的apply方法简化数据提取:
grouped_data = car_data_1.groupby("Manufacturer")["Rev.per.mile"].apply(list).values plt.boxplot(grouped_data, labels=target_brands) # 后续绘图代码同上
内容的提问来源于stack exchange,提问作者Rusty0913
相关产品推荐
相关产品推荐

