如何垂直展开DataFrame的zones列并生成rack、bin新列?
问题:展开DataFrame中的嵌套JSON列表并拆分多行
原始DataFrame:
name zones aa [] bb [{"rack":11,"bin":22},{"rack":33,"bin":44}]
期望转换结果:
name rack bin aa - - bb 11 22 bb 33 44
用户尝试的代码:
cols = ['zones',] df1 = (df.drop(cols, axis=1) .join(pd.concat([pd.json_normalize(df[x].explode()).add_prefix(f'{x}.') for x in cols], axis=1)))
得到的结果不符合预期,仅返回第一个字典的值:
name zones.rack zones.bin 0 aa NaN NaN 1 bb 11.0 22.0
解决方案
问题出在explode()的调用时机不对,正确的做法是先对整个DataFrame的zones列执行explode展开列表,再解析嵌套JSON,最后合并处理空值。
完整代码:
# 展开zones列的列表,空列表会转为NaN df_exploded = df.explode('zones') # 解析每个JSON对象,提取rack和bin字段 df_parsed = pd.json_normalize(df_exploded['zones']) # 合并name列与解析结果,将NaN替换为'-' final_df = df_exploded[['name']].join(df_parsed).fillna('-')
执行后即可得到预期结果:
name rack bin 0 aa - - 1 bb 11 22 1 bb 33 44
原代码失效原因
原代码中df[x].explode()仅展开了列的列表,但后续json_normalize处理后,用join合并时,原DataFrame的行索引未同步更新,导致仅保留了原行的第一个解析结果,无法生成新行。而先对整个DataFrame执行explode,会同步更新行索引,确保每个展开后的JSON对象对应单独一行,再解析就能得到正确的多行结果。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

