如何将Pandas的JSON列转换为多行?处理可变长度数组数据
嘿,这个问题其实很好解决!你需要的是把嵌套的字典结构展开成扁平的行,不管每个rowid对应的列表有多长,pandas都能轻松处理。下面给你两种实用的方法:
方法1:手动遍历展开(直观易懂)
这种方法逻辑清晰,适合新手理解,核心就是逐个遍历每个rowid对应的子列表,把每个字典元素拆成单独的行,同时带上对应的rowid:
import pandas as pd # 你的原始数据 data1 = { 0: [{'confident': False, 'iab': 'IAB25-3'}], 1: [{'confident': False, 'iab': 'IAB6-6'}, {'confident': True, 'iab': 'IAB6'}], 2: [{'confident': True, 'iab': 'IAB16-1'}, {'confident': True, 'iab': 'IAB16'}, {'confident': False, 'iab': 'IAB9'}, {'confident': False, 'iab': 'IAB9-28'}] } # 初始化一个空列表用来存放展开后的数据 flat_rows = [] # 遍历每个rowid和对应的字典列表 for rowid, item_list in data1.items(): # 遍历列表里的每个字典 for item in item_list: # 把rowid和字典里的键值对合并成一个新字典,加入列表 flat_rows.append({ 'rowid': rowid, 'confident': item['confident'], 'iab': item['iab'] }) # 转换成你需要的DataFrame result_df = pd.DataFrame(flat_rows) print(result_df)
运行后输出的结果就是你想要的结构:
rowid confident iab 0 0 False IAB25-3 1 1 False IAB6-6 2 1 True IAB6 3 2 True IAB16-1 4 2 True IAB16 5 2 False IAB9 6 2 False IAB9-28
方法2:用pandas内置方法(简洁高效)
如果想更简洁地用pandas的原生功能处理,可以结合from_dict、explode和apply(pd.Series)来实现,代码更紧凑:
import pandas as pd data1 = { 0: [{'confident': False, 'iab': 'IAB25-3'}], 1: [{'confident': False, 'iab': 'IAB6-6'}, {'confident': True, 'iab': 'IAB6'}], 2: [{'confident': True, 'iab': 'IAB16-1'}, {'confident': True, 'iab': 'IAB16'}, {'confident': False, 'iab': 'IAB9'}, {'confident': False, 'iab': 'IAB9-28'}] } # 第一步:把原始字典转成DataFrame,rowid作为索引,列表存在items列 temp_df = pd.DataFrame.from_dict(data1, orient='index', columns=['items']) # 第二步:把索引转成rowid列,重置索引 temp_df = temp_df.reset_index().rename(columns={'index': 'rowid'}) # 第三步:展开items列,每个列表元素变成一行 temp_df = temp_df.explode('items', ignore_index=True) # 第四步:把items里的字典拆成单独的confident和iab列 result_df = pd.concat([temp_df[['rowid']], temp_df['items'].apply(pd.Series)], axis=1) print(result_df)
这个方法的输出和方法1完全一致,适合处理大规模数据时使用,利用pandas的优化提升效率。
两种方法都能完美处理任意长度的子列表,不管n是1还是100,都能自动展开成对应的行。
内容的提问来源于stack exchange,提问作者Rudresh Mehta
相关产品推荐
相关产品推荐

