Python处理CSV数据时遇AttributeError:'float'对象无split属性
问题解决:AttributeError: 'float' object has no attribute 'split'
问题原因
你的CSV数据中存在空的traffic字段(第1、3行),pandas读取空值时会自动将其转为float类型的NaN,而你定义的get_name等函数直接调用x.split(),NaN作为float对象没有split方法,因此触发报错。
解决方案
步骤1:统一字段类型,处理空值
读取CSV后,先把traffic字段的空值转换为空字符串,确保所有值都是字符串类型:
df["traffic"] = df["traffic"].fillna("")
步骤2:优化数据提取逻辑(推荐用字典解析替代正则)
你的traffic字段内容是类似Python字典的字符串,直接用ast.literal_eval转成字典后提取值,比正则更稳定,还能避免正则匹配失败的问题:
import ast def extract_traffic_info(x): if not x: return {"name": "", "medium": "", "source": ""} try: traffic_dict = ast.literal_eval(x) return { "name": traffic_dict.get("name", "").replace("'", ""), "medium": traffic_dict.get("medium", "").replace("'", ""), "source": traffic_dict.get("source", "").replace("'", "") } except: return {"name": "", "medium": "", "source": ""} # 应用函数并拆分列 traffic_info = df["traffic"].apply(extract_traffic_info).apply(pd.Series) df[["traffic_name", "traffic_medium", "traffic_source"]] = traffic_info
完整修改后代码
import pandas as pd import ast df = pd.read_csv("test.csv") # 处理空值,转为空字符串 df["traffic"] = df["traffic"].fillna("") def extract_traffic_info(x): if not x: return {"name": "", "medium": "", "source": ""} try: traffic_dict = ast.literal_eval(x) return { "name": traffic_dict.get("name", "").replace("'", ""), "medium": traffic_dict.get("medium", "").replace("'", ""), "source": traffic_dict.get("source", "").replace("'", "") } except: return {"name": "", "medium": "", "source": ""} # 提取并拆分字段 traffic_info = df["traffic"].apply(extract_traffic_info).apply(pd.Series) df[["traffic_name", "traffic_medium", "traffic_source"]] = traffic_info # 删除原字段并输出 del df["traffic"] final_df = df.explode(["traffic_name", "traffic_medium", "traffic_source"], ignore_index=True) print(final_df) final_df.to_csv("traffic.csv", index=False)
额外说明
- 用
ast.literal_eval解析字典字符串比正则更可靠,能兼容字段格式的微小变化(比如空格、引号类型) - 增加
try-except和空值判断,避免因数据格式异常导致代码崩溃 - 最后
explode时加上ignore_index=True,可以重置索引,避免空值行的索引混乱
内容的提问来源于stack exchange,提问作者Phh
相关产品推荐
相关产品推荐

