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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:07:38