Python读取GitHub仓库CSV做可视化时数据类型转换失败排查
问题根因
- CSV读取不符合预期:手动通过
names参数传入自定义表头时,没有跳过源文件自带的原生表头行,原生表头会被识别为第一行有效数据;另外读取12月销售数据时漏传了names=headers参数,导致单月数据的列结构和其余11个月不统一。 - 字段类型转换失败:源CSV文件内存在大量重复插入的表头脏行(数据行内容和表头完全一致),同时夹杂全空行,这些异常内容导致pandas默认将所有字段识别为object类型,直接调用
astype()转换数值类型时会触发解析错误。
修复后可直接运行的代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt headers = ['Order ID', 'Product', 'Quantity Ordered', 'Price Each', 'Order Date', 'Purchase Address'] month_file_list = [ 'Sales_January_2019.csv', 'Sales_February_2019.csv', 'Sales_March_2019.csv', 'Sales_April_2019.csv', 'Sales_May_2019.csv', 'Sales_June_2019.csv', 'Sales_July_2019.csv', 'Sales_August_2019.csv', 'Sales_September_2019.csv', 'Sales_October_2019.csv', 'Sales_November_2019.csv', 'Sales_December_2019.csv' ] base_raw_url = 'https://raw.githubusercontent.com/cshort2112/Sample-data/main/' # 批量读取所有月份数据,避免重复代码 all_month_data = [] for file_name in month_file_list: # 读取时跳过源文件自带表头,统一使用自定义表头 month_df = pd.read_csv(base_raw_url + file_name, names=headers, skiprows=1) all_month_data.append(month_df) # 合并全年销售数据 annual_sales = pd.concat(all_month_data, ignore_index=True) # 清洗脏数据:过滤混入的重复表头行、删除全空行 annual_sales = annual_sales[annual_sales['Order ID'] != 'Order ID'] annual_sales = annual_sales.dropna(how='all') # 字段类型转换 annual_sales['Order ID'] = annual_sales['Order ID'].astype(int) annual_sales['Quantity Ordered'] = annual_sales['Quantity Ordered'].astype(int) annual_sales['Price Each'] = annual_sales['Price Each'].astype(float) annual_sales['Order Date'] = pd.to_datetime(annual_sales['Order Date']) # 校验转换结果 print(annual_sales.dtypes) annual_sales.head()
关键修复说明
- 读取CSV时新增
skiprows=1参数,跳过源文件自带的表头行,避免原生表头被误识别为有效数据。 - 统一所有月份数据的读取逻辑,补全12月数据读取时缺失的表头参数,保证全年数据列结构完全一致。
- 增加脏数据清洗步骤,先过滤掉混入的重复表头行、空行,再做类型转换,从根源上解决object类型无法转数值的问题。
- 用循环批量读取文件替代逐月份重复写读取逻辑,减少冗余代码,避免参数漏写的低级错误。
内容的提问来源于stack exchange,提问作者Collin Short
相关产品推荐
相关产品推荐

