You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何垂直展开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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:22:20