如何对含None值的CSV列求和并解决int与str相加类型报错
报错原因
这个报错的核心原因是参与求和运算的元素同时包含int类型和str类型,加法运算符不支持两种不同类型直接运算,结合你写的代码,具体触发逻辑有三个:
read_csv传参错误:你写的pd.read_csv("file.csv",";")中,第二个位置参数对应的是header参数而非分隔符参数,pandas没有正确识别分号分隔符,会导致CSV读入时列结构错乱,大量数值被识别为字符串类型。- 误用
chain.from_iterable:pandas的Series对象本身是一维结构,不需要用chain拍平。对一维序列调用chain.from_iterable会把每个字符串类型的单元格值拆成单个字符,比如字符串"120"会被拆成'1'、'2'、'0'三个独立的字符串元素,混入数值序列中直接触发类型错误。 filter(None, ...)的逻辑缺陷:这个写法只能过滤掉布尔值为假的对象(比如None、空串、0),既不能自动把字符串格式的数值转为数字类型,还会把合法的数值0误判为空值过滤,导致求和结果不准。
另外你写的out['General Lighting'][1:]是硬跳过第一行数据,如果读文件时表头识别错乱,这一步会进一步切分错误数据。
修正方案
直接用pandas原生的数值处理方法即可,不需要引入itertools.chain,逻辑更简单、容错率更高,也不会出现类型错误:
import pandas as pd # 显式指定分隔符读入CSV,保证数据结构识别正确 df = pd.read_csv("file.csv", sep=";") # 将目标列统一转为数值类型,无法转换的无效值/空值设为NaN,求和时自动跳过 total = pd.to_numeric(df['General Lighting'], errors='coerce').sum() print(total)
代码说明:
- 显式传入
sep=";"指定分隔符,避免读入数据结构错乱 pd.to_numeric会自动处理列中的None、空字符串、字符串格式数字,无法转为数值的无效内容会被标记为NaN空值- pandas自带的
.sum()方法默认自动跳过所有NaN值,不会出现类型不匹配问题,也不会误过滤数值0,求和结果准确。 - 如果你确实需要跳过第一行数据再求和,只要把取列的代码改成
df['General Lighting'].iloc[1:]即可,不要直接用[1:]做切片,pandas中用显式的.iloc做位置切片更稳妥。
如果你一定要用原生Python的sum函数实现,不要使用chain.from_iterable,先逐值做类型转换和空值过滤即可:
import pandas as pd df = pd.read_csv("file.csv", sep=";") f1 = df['General Lighting'].iloc[1:] # 不需要跳第一行就去掉.iloc[1:] valid_num = [] for val in f1: # 跳过空值 if pd.isna(val) or str(val).strip() == '': continue # 尝试转成浮点数,转失败的无效值直接跳过 try: valid_num.append(float(val)) except (TypeError, ValueError): continue k = sum(valid_num) print(k)
内容的提问来源于stack exchange,提问作者ilyaf
相关产品推荐
相关产品推荐

