使用Pandas归一化能耗数据时,3月后求和触发TypeError求助
问题分析与解决方案
这个错误我之前处理过,本质是你要汇总的列里混入了字符串类型的数据,导致Pandas没法执行数值加法操作。至于1-3月能正常求和,大概率是前三个月的目标列都是数值类型,而4月及之后的行里,某些单元格出现了非数值内容(比如"NA"、"缺失"、空格,甚至是输入错误的字符),让Pandas把部分行甚至整个列识别成了字符串类型。
排查与解决步骤
1. 先确认数据类型
首先检查你要汇总的列的类型,以及不同月份的数据类型是否一致:
# 查看所有列的数据类型 print(df.dtypes) # 专门检查目标汇总列的类型分布 print(df['your_target_column'].apply(type).value_counts())
如果输出里出现<class 'str'>,那就是问题的核心所在。
2. 定位异常值
找出那些导致列变成字符串的异常单元格,看看具体是哪些内容出了问题:
# 强制转换为数值,无法转换的会变成NaN,筛选出这些异常行 invalid_rows = df[pd.to_numeric(df['your_target_column'], errors='coerce').isna()] print(invalid_rows)
你会看到哪些行的目标列是字符串(比如写了"无数据"、空字符串,或者格式错误的数值)。
3. 清洗数据并转换类型
把目标列强制转换为数值类型,同时根据业务需求处理异常值:
# 转换列为数值,无法转换的设为NaN df['your_target_column'] = pd.to_numeric(df['your_target_column'], errors='coerce') # 处理NaN值(选一种适合你的方式): # 选项1:用列的均值填充 df['your_target_column'].fillna(df['your_target_column'].mean(), inplace=True) # 选项2:用前一个有效值填充 df['your_target_column'].fillna(method='ffill', inplace=True) # 选项3:直接删除包含NaN的行 df = df.dropna(subset=['your_target_column'])
4. 重新执行汇总
确保列是数值类型后,再按月份分组求和:
# 假设你的日期列是datetime类型,提取月份分组 monthly_total = df.groupby(df['date_column'].dt.month)['your_target_column'].sum() print(monthly_total)
额外注意点
- 检查原始CSV文件:4月之后的行是否有格式错误(比如多了引号、逗号,或者单元格内容被意外修改)。
- 如果日期列还是字符串类型,先转换为datetime格式:
df['date_column'] = pd.to_datetime(df['date_column'], errors='coerce'),避免分组时出现异常。
内容的提问来源于stack exchange,提问作者Morgan Parlo
相关产品推荐
相关产品推荐

