Pandas处理CSV单元格去重时报'float' object is not iterable错误如何解决
问题原因
你遇到的TypeError: 'float' object is not iterable报错,本质是pub_emp_year列存在空值:pandas读取CSV文件时,默认会把单元格空值解析为float类型的NaN。你对NaN执行str.split()操作后返回的还是NaN,后续调用map(set)时尝试将float类型的NaN转为集合,就触发了迭代错误。
你可以先执行以下代码确认空值数量:
print(df['pub_emp_year'].isna().sum())
解决方案
推荐使用带空值兼容逻辑的自定义函数处理,同时还可以选择是否保留单元格内词汇的原有顺序:
方案1:保留空值+保留词汇首次出现顺序(推荐)
import pandas as pd filepath = "C:/data/Untitled Folder/creditdata.csv" df = pd.read_csv(filepath, encoding='utf-8') def cell_dedup(s): # 跳过非字符串类型的空值/异常值 if not isinstance(s, str): return s # 分割后用dict.fromkeys去重,Python3.7+默认保留插入顺序 unique_words = list(dict.fromkeys(s.split(", "))) return ", ".join(unique_words) # 处理单列 for col in ["pub_emp_year"]: df[col] = df[col].apply(cell_dedup) # 如需处理多列直接在列表里加列名即可,例如: # for col in ["pub_emp_year", "col_a", "col_b"]: # df[col] = df[col].apply(cell_dedup) df.to_csv('creditdata2.csv', mode='a', index=False)
方案2:空值转空字符串处理
如果你不需要保留原空值标识,可以先把空值填充为空字符串再处理:
for col in ["pub_emp_year"]: df[col] = df[col].fillna("")\ .str.split(", ")\ .map(lambda x: ", ".join(dict.fromkeys(x)))\ # 可选:处理完再把空字符串转回NaN .replace("", pd.NA)
注意事项
- 不要直接使用
set去重,set会打乱词汇的原有顺序,对顺序有要求的场景务必用dict.fromkeys实现去重。 - 追加写入CSV时注意表头重复问题,如果是首次写入不要加
mode='a'参数,避免表头多次写入。
内容的提问来源于stack exchange,提问作者reresearchgames
相关产品推荐
相关产品推荐

