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

Pandas TypeError求助:字符串与整数拼接错误排查及解决

解决Pandas数据处理中的TypeError问题

问题描述

需要完成两项数据计算任务:

  • 计算评分高于4且总评分量超过1000的书籍平均评论数
  • 计算评分在2-3之间且总评分量低于500的书籍平均评论数

编写的Pandas代码运行时抛出TypeError: can only concatenate str (not "int") to str错误,且AI回复称代码无问题,现寻求解决方法。

原代码

import pandas as pd 

df = pd.read_csv('data/GoodReads_100k_books.csv')

above = df[(df['rating'] > 4) & (df['totalratings'] > 1000)].mean()

below = df[(2 <= df['rating'] <= 3) & (df['totalratings'] < 500)].mean()

print(above)
print(below)

错误信息

TypeError                                 Traceback (most recent call last)
Cell In[15], line 5
      1 import pandas as pd 
      3 df = pd.read_csv('data/GoodReads_100k_books.csv')
----> 5 above = df[(df['rating'] > 4) & (df['totalratings'] > 1000)].mean()
      7 below = df[(2 <= df['rating'] <= 3) & (df['totalratings'] < 500)].mean()
      9 print(above)

TypeError: can only concatenate str (not "int") to str

问题分析

  1. 数据类型错误:错误核心是rating或totalratings列被识别为字符串类型,当用字符串和整数做比较时,Pandas尝试将整数转为字符串拼接,触发类型错误。
  2. 布尔条件写法错误:Pandas不支持2 <= df['rating'] <=3这种连续比较语法,需要拆分为两个条件并用&连接,同时用括号包裹单个条件。
  3. 均值计算范围错误:原代码调用mean()会计算筛选后DataFrame所有数值列的均值,而我们只需要评论数(假设列名为reviews)的平均值。

解决步骤及修正代码

步骤1:转换数据类型

读取CSV时强制指定目标列为数值类型,或读取后转换,同时处理可能的非数值脏数据。

步骤2:修正布尔筛选条件

步骤3:指定计算评论数列的均值

修正后的代码:

import pandas as pd 

# 读取数据时处理类型转换,兼容非数值脏数据
df = pd.read_csv(
    'data/GoodReads_100k_books.csv',
    converters={
        'rating': lambda x: pd.to_numeric(x, errors='coerce'),
        'totalratings': lambda x: pd.to_numeric(x, errors='coerce'),
        'reviews': lambda x: pd.to_numeric(x, errors='coerce')
    }
)

# 筛选高评分高热度书籍,计算平均评论数
above_avg_reviews = df[(df['rating'] > 4) & (df['totalratings'] > 1000)]['reviews'].mean()

# 筛选中低评分低热度书籍,计算平均评论数
below_avg_reviews = df[(df['rating'] >= 2) & (df['rating'] <= 3) & (df['totalratings'] < 500)]['reviews'].mean()

print(f"高评分高热度书籍平均评论数: {above_avg_reviews}")
print(f"中低评分低热度书籍平均评论数: {below_avg_reviews}")

额外检查建议

  • 运行df.dtypes查看各列数据类型,确认rating、totalratings、reviews均为数值类型。
  • 运行df[['rating', 'totalratings', 'reviews']].isna().sum()检查转换后是否有NaN值,必要时用dropna()或填充值处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:52:43