使用pd.json_normalize批量扁平化DataFrame字典列失败问题咨询
解决pd.json_normalize批量处理嵌套字典列表列的异常问题
问题场景
你遇到的情况是:DataFrame的addresses列,每个元素都是包含单个字典的列表,示例数据如下:
df['addresses'][0] [{'addressLine1': '124 Main Street', 'addressLine2': '', 'addressLine3': '', 'city': 'Portland', 'region': 'ME', 'postalCode': '04019', 'country': 'USA'}]
单独处理单个元素pd.json_normalize(df['addresses'][0])能得到正常展开的DataFrame,但直接批量处理整列pd.json_normalize(df['addresses'])时,结果会是嵌套结构,完全不符合需求。
问题原因
pd.json_normalize()的逻辑是:传入列表时,会把列表里的每个元素当作独立的待规范化对象。而你的addresses列每个元素本身就是列表,相当于传入了“列表套列表”,函数会把外层列表的每个子列表当成完整对象处理,最后就生成了嵌套的结果。
解决方案
方案1:直接提取子列表里的字典(适合每个子列表只有一个字典的情况)
先把addresses列里每个子列表的字典取出来,再传给pd.json_normalize:
# 提取每个列表中的第一个(也是唯一的)字典 normalized_df = pd.json_normalize(df['addresses'].str[0])
方案2:先拆分行再规范化(适合子列表可能有多个字典的情况)
如果你的数据里,有些子列表可能包含多个字典,可以先用explode把列表拆成单独的行,再做规范化:
# 把addresses列的列表展开,每个字典占一行 exploded_df = df.explode('addresses') # 规范化addresses列的字典 normalized_df = pd.json_normalize(exploded_df['addresses']) # 和原DataFrame的其他列合并 final_df = exploded_df.drop('addresses', axis=1).join(normalized_df)
内容的提问来源于stack exchange,提问作者Young Z
相关产品推荐
相关产品推荐

