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

如何将含列表的JSON数据填充到预定义Pandas DataFrame并处理列表字段?

我来帮你搞定这个需求!针对你提到的两种处理col_b列表的场景(拆分行/独热编码),我整理了两种清晰的实现方案,结合pd.json_normalize和Pandas的工具来处理,完美适配你的JSON格式:

方案1:将col_b的列表拆分为多行

这个方案会把col_b里的每个列表元素拆成单独的行,同时重复id、col_a、col_c的值,完全符合你的需求。核心思路是先把JSON的键(也就是id值)整合到数据结构里,再用explode展开列表:

import pandas as pd

# 预定义的初始DataFrame
df1 = pd.DataFrame(columns=["id", "col_a", "col_b", "col_c"])

# 测试用的两种JSON数据
json_single_val = {'123': {'col_a': 5, 'col_b': "kuku", 'col_c': True}}
json_list_val = {'123': {'col_a': 5, 'col_b': ["kuku", "bubu", "fooo"], 'col_c': True}}

def add_json_expand_rows(df, json_input):
    # 把JSON的id键和对应字段合并成标准化列表,方便json_normalize处理
    normalized_items = []
    for id_str, fields in json_input.items():
        item = {"id": id_str}
        item.update(fields)
        normalized_items.append(item)
    
    # 加载数据到临时DataFrame
    temp_df = pd.json_normalize(normalized_items)
    # 展开col_b的列表(非列表值不会受影响)
    temp_df = temp_df.explode("col_b", ignore_index=True)
    
    # 合并到初始DataFrame
    return pd.concat([df, temp_df], ignore_index=True)

# 测试单个值的情况
result_single = add_json_expand_rows(df1, json_single_val)
print("处理单个col_b值的结果:")
print(result_single)

# 测试列表值的情况
result_list = add_json_expand_rows(df1, json_list_val)
print("\n处理col_b列表的结果:")
print(result_list)

运行后,列表值的col_b会被拆成3行,其他字段保持重复,完全符合预期。

方案2:对col_b的列表进行独热编码

如果需要把col_b的列表转换成独热编码格式,可以用MultiLabelBinarizer来处理,它能自动识别所有可能的标签并生成对应列:

import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer

# 同样用初始的df1
df1 = pd.DataFrame(columns=["id", "col_a", "col_b", "col_c"])

def add_json_onehot(df, json_input):
    # 第一步还是标准化数据结构
    normalized_items = []
    for id_str, fields in json_input.items():
        item = {"id": id_str}
        item.update(fields)
        normalized_items.append(item)
    
    temp_df = pd.json_normalize(normalized_items)
    
    # 统一格式:把单个值转成单元素列表,方便后续编码
    temp_df["col_b"] = temp_df["col_b"].apply(lambda x: x if isinstance(x, list) else [x])
    
    # 生成独热编码
    mlb = MultiLabelBinarizer()
    onehot_df = pd.DataFrame(
        mlb.fit_transform(temp_df["col_b"]),
        columns=mlb.classes_,
        index=temp_df.index
    )
    
    # 合并编码列和原数据,删除原col_b
    temp_df = pd.concat([temp_df.drop("col_b", axis=1), onehot_df], axis=1)
    
    # 合并到初始DataFrame
    return pd.concat([df, temp_df], ignore_index=True)

# 测试列表值的情况
result_onehot = add_json_onehot(df1, json_list_val)
print("独热编码的结果:")
print(result_onehot)

这个方案会生成kuku、bubu、fooo三个列,对应的值为1表示该行包含这个标签,0则不包含。

两种方案都能灵活处理你的JSON格式,你可以根据业务需求选择合适的方式。

内容的提问来源于stack exchange,提问作者SteveS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:27:31