DataFrame含字典列展开失败:原因排查与解决方法
问题原因分析
你原来的代码核心问题出在pd.concat的默认行为上:concat默认是按行拼接(axis=0),相当于把原DataFrame p 和展开后的event_properties DataFrame的行上下堆叠,而非左右合并。所以你查询前两行时,取的是原p的行——原p里并没有author列,自然显示NaN,展开后的列数据其实在结果的后半部分,完全不符合你要的“原数据与展开列并列”的需求。
修复方法
方法1:修正concat的轴参数
明确指定axis=1让concat按列合并:
p = df.copy() # 从event_properties列提取字典列表生成新DataFrame event_properties = pd.DataFrame(p['event_properties'].tolist()) # 按列拼接原数据和展开后的列 df = pd.concat([p, event_properties], axis=1) # 可选:删除原event_properties列(如果不需要保留的话) df = df.drop('event_properties', axis=1)
方法2:用pd.json_normalize高效处理
针对字典列的展开需求,pandas提供了专门的json_normalize方法,处理大型DataFrame时效率更高,还能自动处理嵌套字典:
# 直接展开event_properties列的所有字典键为新列 expanded_df = pd.json_normalize(df['event_properties']) # 按列合并原DataFrame和展开后的结果 df = pd.concat([df, expanded_df], axis=1) # 可选:删除原event_properties列 df = df.drop('event_properties', axis=1)
执行以上任意一种方法后,再查询df[['event_properties', 'author']][:2],就能看到author列正确填充对应的值,不存在该键的行则自动填充NaN(对应你说的None,pandas中用NaN表示缺失值)。
内容的提问来源于stack exchange,提问作者Federico Vega
相关产品推荐
相关产品推荐

