如何将含列表的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
相关产品推荐
相关产品推荐

