Python中比较两个字典值并按键生成共有值配对的方法,以及按值分组提取字典键并匹配Pandas DataFrame对应列的实现
解答你的两个问题
问题1:Python中比较字典值并配对相同值的项
分两种常见场景来给你说明:
场景1:找两个字典中键相同且值相等的项
如果是要找出两个字典里键存在交集、且对应值也相等的项,用字典推导式就能快速搞定:
dict_a = {"a": 1, "b": 2, "c": 3} dict_b = {"a": 1, "b": 4, "c": 3, "d": 5} # 筛选键共通且值相等的项,值以元组形式保留两个字典的对应值 matched_items = {k: (dict_a[k], dict_b[k]) for k in dict_a if k in dict_b and dict_a[k] == dict_b[k]} print(matched_items) # 输出: {'a': (1, 1), 'c': (3, 3)}
场景2:找出两个字典中值相同的所有键对(不管键是否一致)
如果是要把所有值相同的键两两配对,先把每个字典的值映射到对应的键列表,再找共同值的配对:
from collections import defaultdict # 辅助函数:把字典转成「值: 键列表」的映射 def value_to_keys_mapper(d): value_map = defaultdict(list) for key, val in d.items(): value_map[val].append(key) return value_map dict_a = {"a": 1, "b": 2, "c": 3} dict_b = {"x": 1, "y": 2, "z": 4} map_a = value_to_keys_mapper(dict_a) map_b = value_to_keys_mapper(dict_b) # 生成所有值相同的键对 matched_pairs = [] # 找两个映射的共同值 common_values = set(map_a.keys()) & set(map_b.keys()) for val in common_values: # 把两个字典中对应这个值的键两两组合 for key_a in map_a[val]: for key_b in map_b[val]: matched_pairs.append( (key_a, key_b, val) ) print(matched_pairs) # 输出: [('a', 'x', 1), ('b', 'y', 2)]
问题2:同步DataFrame中相同标签对应的start列值
先给你优化下生成parl1字典的代码——你的循环有点冗余,用Pandas原生操作更简洁高效:
# 替代你的循环,直接筛选非空的parallels,转成字符串后转字典 parl1 = data[data["parallels"].notna()]["parallels"].astype(str).to_dict()
接下来实现核心需求:把同一标签值对应的所有行的start列设为相等,步骤如下:
步骤1:按标签值分组索引
先把parl1里的标签值和对应的DataFrame索引分组:
from collections import defaultdict value_indices_map = defaultdict(list) for idx, label in parl1.items(): value_indices_map[label].append(idx)
比如你的示例{2: '2.0', 3: '1.0', 4: '2.0', 5: '1.0'},会得到:
{'2.0': [2, 4], '1.0': [3, 5]}
步骤2:同步start列的值
你可以选择用分组里第一个索引的start值作为基准,也可以用分组里最早的时间作为基准,两种方案都给你:
方案1:用分组第一个索引的start值同步
for label, indices in value_indices_map.items(): # 取分组内第一个索引的start值作为基准 base_start_time = data.loc[indices[0], "start"] # 把该分组所有索引的start列设为基准值 data.loc[indices, "start"] = base_start_time
方案2:用分组内最早的start值同步(更合理的时间基准)
如果start是DateTime类型,想让同一标签的行都用最早的时间,就用这个:
for label, indices in value_indices_map.items(): # 筛选分组内的start值,取最小的(最早的时间) earliest_start = data.loc[indices, "start"].min() data.loc[indices, "start"] = earliest_start
这样就能自动完成所有相同标签行的start值匹配了。
内容的提问来源于stack exchange,提问作者Addm1X
相关产品推荐
相关产品推荐

