如何合并字典中实验变量相同的重复键并拼接对应值?
化学实验数据字典合并实现方案
核心思路
将每个字典键拆分为实验编号和实验标识后缀(即除编号外的剩余部分),通过实验标识后缀对条目分组,同一组内的列表值进行拼接,最终用组内最小的实验编号(或自定义规则)生成新键。
代码实现(Python原生)
首先定义你的原始字典:
original_dict = { '6_batch_pfoa_zif-8-fg-6': [1, 1, 1], '6_batch_pfoa_zif-8-fg-24': [2, 2, 2], '6_batch_genx_zif-8-fg-6': [3, 3, 3], '6_batch_genx_zif-8-fg-24': [4, 4, 4], '6_batch_pfos_zif-8-fg-6': [5, 5, 5], '6_batch_pfos_zif-8-fg-24': [6, 6, 6], '7_batch_pfoa_zif-8-fg-6': [7, 7, 7], '7_batch_pfoa_zif-8-fg-24': [8, 8, 8], '7_batch_pfos_zif-8-fg-6': [9, 9, 9], '8_batch_pfoa_zif-8-fg-6': [10, 10, 10], '8_batch_pfoa_fg': [11, 11, 11], '8_batch_genx_fg': [12, 12, 12], '8_batch_pfos_zif-8-fg-6': [13, 13, 13], '8_batch_pfos_fg': [14, 14, 14] }
然后执行合并逻辑:
# 1. 按实验标识后缀分组,收集每组的实验编号和对应列表 grouped_data = {} for key, values in original_dict.items(): split_parts = key.split('_') exp_id = split_parts[0] suffix = '_'.join(split_parts[1:]) if suffix not in grouped_data: grouped_data[suffix] = [] grouped_data[suffix].append((int(exp_id), values)) # 2. 合并每组数据,用组内最小实验编号生成新键 merged_dict = {} for suffix, items in grouped_data.items(): # 按实验编号排序,取最小编号作为新键前缀 items_sorted = sorted(items, key=lambda x: x[0]) min_exp_id = str(items_sorted[0][0]) # 拼接所有列表值 combined_values = [] for _, val in items_sorted: combined_values.extend(val) # 构造最终键值对 merged_dict[f"{min_exp_id}_{suffix}"] = combined_values
执行后,merged_dict中会得到你需要的结果,例如:'7_batch_pfoa_zif-8-fg-6': [7, 7, 7, 10, 10, 10]
Pandas实现方案(适合已有Pandas工作流)
如果你的数据是通过Pandas处理得到的,可以直接用DataFrame分组完成合并:
import pandas as pd # 将原始字典转为DataFrame df = pd.DataFrame(list(original_dict.items()), columns=['key', 'value']) # 拆分键为实验编号和后缀 df['exp_id'] = df['key'].str.split('_').str[0] df['suffix'] = df['key'].str.split('_', 1).str[1] # 分组合并 merged_df = df.groupby('suffix').agg( min_exp_id=('exp_id', lambda x: x.min()), combined_value=('value', lambda x: [item for sublist in x for item in sublist]) ).reset_index() # 转换为目标字典 merged_dict = merged_df.apply( lambda row: (f"{row['min_exp_id']}_{row['suffix']}", row['combined_value']), axis=1 ).to_dict()
自定义规则调整
- 若不想用最小实验编号,可改为保留第一个出现的编号:将
sorted(items, key=lambda x: x[0])改为直接取items[0]即可。 - 若需要保留所有实验编号信息,可将新键设为类似
merged_{suffix}的格式,或拼接所有编号。
内容的提问来源于stack exchange,提问作者Radwance
相关产品推荐
相关产品推荐

