如何从含重复键的两个嵌套列表生成字典列表?
处理嵌套键值对生成嵌套字典与Pandas DataFrame
问题描述
给定两组嵌套列表形式的键值输入,部分键(如K1、K2)对应多个值:
key_in = [['K1', 'K1', 'K2', 'K3'], ['K1', 'K2', 'K2', 'K3']] val_in = [['V1', 'V2', 'V3', 'V4'], ['V5', 'V6', 'V7', 'V8']]
需要将其转换为嵌套字典列表:
out = [{'K1': {'V1', 'V2'}, 'K2': {'V3'}, 'K3': {'V4'}}, {'K1': {'V5'}, 'K2': {'V6', 'V7'}, 'K3': {'V8'}}]
最终目标是生成如下Pandas DataFrame(考虑到百万行数据的效率需求):
K1 K2 K3 0 {V1, V2} {V3} {V4} 1 {V5} {V6, V7} {V8}
直接使用dict(zip(k, v)) for k, v in zip(key_in, val_in)无法处理一对多的键值关系,会导致重复键的取值被覆盖。
解决方案
1. 纯Python方法生成嵌套字典列表
利用collections.defaultdict收集每个键对应的多个值,避免覆盖问题:
from collections import defaultdict key_in = [['K1', 'K1', 'K2', 'K3'], ['K1', 'K2', 'K2', 'K3']] val_in = [['V1', 'V2', 'V3', 'V4'], ['V5', 'V6', 'V7', 'V8']] result_dicts = [] for keys, vals in zip(key_in, val_in): temp_dict = defaultdict(set) for k, v in zip(keys, vals): temp_dict[k].add(v) result_dicts.append(dict(temp_dict))
运行后result_dicts即为目标嵌套字典列表。
2. Pandas高效处理百万级数据生成目标DataFrame
对于百万行数据,Pandas的向量化分组聚合操作效率远高于纯Python循环,步骤如下:
import pandas as pd # 将嵌套列表转换为长格式DataFrame rows_data = [] for row_idx, (keys, vals) in enumerate(zip(key_in, val_in)): for k, v in zip(keys, vals): rows_data.append({'row_idx': row_idx, 'key': k, 'value': v}) df_long = pd.DataFrame(rows_data) # 按行索引和键分组,聚合值为集合,再转为宽格式 df_final = df_long.groupby(['row_idx', 'key'])['value'].agg(set).unstack(fill_value=set()) # 清理格式 df_final.columns.name = None df_final.reset_index(drop=True, inplace=True)
运行后df_final即为目标格式的DataFrame,该方法通过分组聚合避免了逐行循环的性能瓶颈,适合大规模数据处理。
内容的提问来源于stack exchange,提问作者nplusone
相关产品推荐
相关产品推荐

