Pandas展平DataFrame列并与原表拼接时结果异常及缺失问题
解决DataFrame嵌套字典列展平拼接异常问题
问题核心
你用pd.json_normalize()处理单字典元素的列时,字典内的列表值会干扰展平后的行对齐逻辑——哪怕你手动重置过索引,pd.concat()的ignore_index=True参数反而会破坏原有的行映射关系,导致拼接结果出现错位或缺失。
修复方案
方案1:用apply(pd.Series)替代pd.json_normalize()展平
针对列中每个元素是单个字典的场景,apply(pd.Series)能稳定将字典键转为列,且自动保留原行的索引对齐:
# 假设原DataFrame名为df,目标嵌套列名为nested_data flatten_df = df['nested_data'].apply(pd.Series) # 保留原索引拼接,避免错位 result_df = pd.concat([df, flatten_df], axis=1)
方案2:预处理字典内的列表值(可选)
如果字典里的列表仅含单个元素(比如account和ip的列表长度都是1),可以先把列表拆为单个值,避免后续数据异常:
def parse_dict(d): return {k: v[0] if len(v) > 0 else None for k, v in d.items()} # 先处理列表值,再展平列 flatten_df = df['nested_data'].apply(parse_dict).apply(pd.Series) result_df = pd.concat([df, flatten_df], axis=1)
方案3:强制对齐索引后用pd.json_normalize()拼接
若坚持用pd.json_normalize(),需先让展平后的DataFrame索引与原DataFrame完全一致,再关闭ignore_index:
flatten_df = pd.json_normalize(df['nested_data']) # 强制对齐索引 flatten_df.index = df.index result_df = pd.concat([df, flatten_df], axis=1)
验证拼接正确性
拼接后可通过以下代码确认行对应关系:
# 检查原列的ip值与展平后的ip列是否完全匹配 assert all(df['nested_data'].apply(lambda x: x['ip'][0]) == result_df['ip'])
内容的提问来源于stack exchange,提问作者Swarup Pattnaik
相关产品推荐
相关产品推荐

