pandas访问DataFrame字典列嵌套键报KeyError如何解决
报错原因
你写的df['d']['latitude']触发KeyError,本质是混淆了Series索引和单元格内字典的键:df['d']返回的是整列的Series对象,它的索引是DataFrame的行号(0到6004),不存在名为latitude的索引项,自然找不到对应值。latitude、longitude是d列每个单元格里存储的字典的内部键,不属于DataFrame/Series的索引层级,不能直接按列索引的链式写法调用。
你的d列数据结构如下:
Index(['_id', 'd'], dtype='object') 0 {'latitude': 35.685, 'longitude': 139.7514} 1 {'latitude': 60.0, 'longitude': -95.0} 2 {'latitude': 54.94499999999999, 'longitude': -... 3 {'latitude': 41.32740000000001, 'longitude': -... 4 {'latitude': 42.83330000000001, 'longitude': 1... ... 6000 {'latitude': 41.1412, 'longitude': -73.2637} 6001 {'latitude': 52.5, 'longitude': 5.75} 6002 {'latitude': 1.3667000000000087, 'longitude': ... 6003 {'latitude': 41.1412, 'longitude': -73.2637} 6004 {'latitude': 45.16669999999999, 'longitude': 2... Name: d, Length: 6005, dtype: object
正确访问方法
按你的使用场景选对应写法就行:
- 提取全量纬度/经度序列:用pandas的str访问器直接提取字典键,写法最简单,对空值兼容性好
返回结果是和原DataFrame长度一致的Series,可以直接打印、做计算,也可以直接赋值成新列:# 提取所有行的纬度 all_lat = df['d'].str['latitude'] # 提取所有行的经度 all_lon = df['d'].str['longitude']df['latitude'] = df['d'].str['latitude']。 - 一次性把字典拆成独立列:如果后续要频繁用经纬度做计算,直接把
d列的字典展开成单独的列更方便
处理完之后直接用# 把d列每个字典转成单列Series,生成经纬度两列 coord_df = df['d'].apply(pd.Series) # 把新生成的经纬度列拼回原表 df = pd.concat([df, coord_df], axis=1)df['latitude']、df['longitude']就能访问对应字段,不用再操作字典。 - 取某一行的经纬度值:先定位到对应行的单元格,再取字典的键
# 取索引为0的行的纬度值 first_row_lat = df.loc[0, 'd']['latitude']
注意:如果
d列里有空值、非字典类型的内容,str['键名']的写法会自动返回空值,不会抛异常中断代码,比自己写逐行循环、lambda判断的稳定性更高。
内容的提问来源于stack exchange,提问作者dopeb3ar2
相关产品推荐
相关产品推荐

