如何将Pandas列中的嵌套字典解析为独立列?解决df['d'].str['property'].str['building']返回NaN的问题
解决Pandas嵌套字典/列表混合列的解析问题
你遇到的问题其实很常见——因为d列里的property对应的是列表类型(哪怕里面只有一个字典元素),直接用str['property'].str['building']自然会返回NaN,毕竟列表没有building这个键嘛。下面给你两种实用的解决思路:
方法一:分步提取目标字典
先从property列表里取出唯一的字典元素,再提取building内容:
# 方式1:用apply遍历每个元素 df['building'] = df['d'].apply(lambda x: x['property'][0]['building']) # 方式2:用str链式操作(更贴合你原来的思路) df['building'] = df['d'].str['property'].str[0].str['building']
这样df['building']就会存储每个行对应的building字典了。
方法二:一键展开所有嵌套字段(更高效)
如果需要把嵌套里的所有子字段都拆成单独的列,比如building.size.bldgsize、construction.constructiontype这些,用pd.json_normalize会更省心:
# 先提取property列表里的字典元素,再用json_normalize展开所有嵌套键 property_details = pd.json_normalize(df['d'].apply(lambda x: x['property'][0])) # 把原DataFrame的id列和展开后的字段合并 final_df = pd.concat([df[['id']], property_details], axis=1)
执行后final_df会包含类似identifier.Id、address.country、building.summary.bldgsNum这样的扁平化列,直接就能用这些字段做后续分析了。
为啥原来的代码不行?
再给你捋一遍逻辑:
df['d'].str['property']返回的是一个Series,每个元素是列表(比如你的数据里就是[ {...} ])- 列表没有键,所以你再用
.str['building']的时候,Pandas找不到对应的键,就返回NaN了 - 必须先用
.str[0]把列表里的字典元素取出来,之后才能继续用.str['键名']提取内容
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

