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

如何从Pandas DataFrame生成值唯一的字典?

解决方法:生成键值唯一的字典(col_a为键,col_b值不重复)

你遇到的问题是因为df.set_index('col_a')['col_b'].to_dict()会保留每个索引的最后一个值,且无法保证col_b的值全局唯一。要生成满足要求的字典,需确保每个col_a对应的col_b值在整个字典里不重复,以下是几种可行方案:

方案1:随机生成一个合法字典

先按col_a分组收集每个组的col_b可选值,再通过随机选择+去重校验生成符合要求的字典:

import pandas as pd
import random

# 构造目标DataFrame
df = pd.DataFrame({
    'col_a': ['a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c'],
    'col_b': [1, 2, 1, 2, 3, 4, 1, 2, 3]
})

# 按col_a分组,提取每个组的唯一值
grouped = df.groupby('col_a')['col_b'].unique().to_dict()

def generate_unique_dict(grouped_vals):
    keys = list(grouped_vals.keys())
    used_values = set()
    result = {}
    # 优先处理可选值少的key,避免最后无可用值
    sorted_keys = sorted(keys, key=lambda k: len(grouped_vals[k]))
    
    for key in sorted_keys:
        available = [v for v in grouped_vals[key] if v not in used_values]
        if not available:
            # 无可用值时重新生成
            return generate_unique_dict(grouped_vals)
        selected = random.choice(available)
        result[key] = selected
        used_values.add(selected)
    return result

# 生成示例字典
print(generate_unique_dict(grouped))
# 可能输出:{'a': 2, 'b': 4, 'c': 1} 或其他符合要求的组合

方案2:枚举所有合法字典

如果需要获取所有满足条件的组合,可以用笛卡尔积遍历所有可能,筛选出值不重复的结果:

from itertools import product

# 提取每个组的可选值列表
a_vals = grouped['a'].tolist()
b_vals = grouped['b'].tolist()
c_vals = grouped['c'].tolist()

# 生成并筛选合法字典
valid_dicts = []
for a_val, b_val, c_val in product(a_vals, b_vals, c_vals):
    if len({a_val, b_val, c_val}) == 3:
        valid_dicts.append({'a': a_val, 'b': b_val, 'c': c_val})

# 输出所有合法组合
for d in valid_dicts:
    print(d)

方案3:按固定规则选择值

如果不需要随机,可按规则选取(比如优先选每个组的最小值且不重复):

def select_by_rule(grouped_vals):
    used = set()
    result = {}
    for key in grouped_vals:
        # 从当前组的最小值开始,选取第一个未被使用的值
        for val in sorted(grouped_vals[key]):
            if val not in used:
                result[key] = val
                used.add(val)
                break
    return result

print(select_by_rule(grouped))
# 输出:{'a': 1, 'b': 2, 'c': 3}

这些方案都能确保生成的字典中,每个col_a对应唯一的col_b值,且所有value全局不重复,你可以根据实际需求选择对应方式。

内容的提问来源于stack exchange,提问作者frogseer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:12:46