Pandas DataFrame字典列取值报错float对象无get属性如何解决
报错原因
报错核心是street address列不是所有行都是字典类型,存在部分空值被Pandas自动解析为float类型的NaN:你测试的第0行确实是字典,但其他行存在缺失值,Google Maps API返回空结果时你的数据入库逻辑没有做非空校验,导致空值被转为NaN(Pandas中缺失值默认类型为float),apply遍历到这些行时,NaN调用get方法就会抛出该错误。
问题验证
你可以运行以下代码确认异常行的存在:
all_addr['street address'].apply(lambda x: type(x)).value_counts()
运行后输出结果中会出现float类型的条目,对应数量就是API返回为空的行数。
解决方案
- 方案1:保留所有行,空值对应字段返回None
all_addr['address_components'] = all_addr['street address'].apply(lambda x: x.get('address_components') if isinstance(x, dict) else None)
- 方案2:先过滤掉无效空行,只处理正常返回的字典数据
# 筛选出字段为字典类型的有效行 valid_addr = all_addr[all_addr['street address'].apply(lambda x: isinstance(x, dict))].copy() # 提取目标字段 valid_addr['address_components'] = valid_addr['street address'].apply(lambda x: x.get('address_components'))
- 方案3:自动展开所有字典字段到独立列(无需手动写get逻辑)
如果需要提取字典内的所有字段(包括经纬度、格式化地址等),可以直接用pd.json_normalize更便捷:
# 筛选有效行 valid_addr = all_addr[all_addr['street address'].apply(lambda x: isinstance(x, dict))].copy() # 自动展开字典所有层级的字段 expand_addr_df = pd.json_normalize(valid_addr['street address']) # 合并回原表 final_df = pd.concat([valid_addr.reset_index(drop=True), expand_addr_df.reset_index(drop=True)], axis=1)
内容的提问来源于stack exchange,提问作者user3703869
相关产品推荐
相关产品推荐

