Pandas加载数据到BigQuery报str与int不可比较TypeError求助
问题排查与解决方案
核心报错原因
你代码中的column_names列表重复声明了website字段,触发了BigQuery Python客户端处理DataFrame列索引时的内部异常:
# 原代码错误点:website列重复出现两次 column_names = ["date", "query", "page", "clicks", "impressions", "ctr", "position", "website", "country", "device", "website"]
pandas本身允许存在同名列,但BigQuery的load_table_from_dataframe方法做列映射时,会对列索引做去重、排序校验,过程中涉及的索引操作触发了字符串与整数的类型比较错误,这部分逻辑属于BigQuery SDK内部实现,所以你自己的业务代码里不会显式出现比较逻辑。
修复步骤
- 第一步:删除
column_names列表中重复的website字段,确保所有列名唯一
# 修正后的列名列表 column_names = ["date", "query", "page", "clicks", "impressions", "ctr", "position", "website", "country", "device"] result = result.reindex(columns=column_names)
- 第二步:显式转换数值列类型,避免列内出现混合类型的问题
result[['clicks', 'impressions']] = result[['clicks', 'impressions']].astype(int) result[['ctr', 'position']] = result[['ctr', 'position']].astype(float)
- 第三步(可选):显式指定BigQuery表Schema,减少SDK自动推断类型的出错概率
job_config.schema = [ bigquery.SchemaField("date", "STRING"), bigquery.SchemaField("query", "STRING"), bigquery.SchemaField("page", "STRING"), bigquery.SchemaField("clicks", "INTEGER"), bigquery.SchemaField("impressions", "INTEGER"), bigquery.SchemaField("ctr", "FLOAT"), bigquery.SchemaField("position", "FLOAT"), bigquery.SchemaField("website", "STRING"), bigquery.SchemaField("country", "STRING"), bigquery.SchemaField("device", "STRING"), ]
内容的提问来源于stack exchange,提问作者sitestem
相关产品推荐
相关产品推荐

