将含重复键的Pandas DataFrame转换为字典的问题
解决Pandas DataFrame转字典(重复键对应值列表)的问题
嘿,这个坑我之前踩过!你原来的代码之所以只保留每个键的最后一个值,是因为set_index遇到重复索引时,虽然表面上保留了所有行,但当你转置(.T)再用to_dict('list')时,重复的列名(也就是原来的重复键)会被最后一次出现的覆盖,所以最终字典里每个键只剩最后一个值。
下面给你几种简单靠谱的实现方法:
方法1:Pandas原生分组聚合(最推荐)
这是最符合Pandas风格的写法,一行代码搞定:
mydict = df.groupby('Keys')['Values'].agg(list).to_dict()
原理:
groupby('Keys'):按Keys列的唯一值分组agg(list):把每组对应的Values值聚合成一个列表to_dict():直接把分组后的Series转换成你需要的字典格式
运行后就能得到你想要的结果:{1: [1,6,9], 2: [3], 3: [1,4]}
方法2:用collections.defaultdict手动遍历
如果你喜欢更直观的循环处理,可以用Python标准库的defaultdict:
from collections import defaultdict # 初始化默认值为列表的字典 mydict = defaultdict(list) # 遍历DataFrame的每一行 for key, val in df.itertuples(index=False): mydict[key].append(val) # 可选:如果需要转成普通字典(而非defaultdict类型) mydict = dict(mydict)
这种方法逻辑清晰,适合需要在遍历过程中做额外处理的场景。
方法3:用apply替代agg
和方法1类似,只是把agg(list)换成apply(list),效果完全一样:
mydict = df.groupby('Keys')['Values'].apply(list).to_dict()
选哪种全看个人代码习惯~
内容的提问来源于stack exchange,提问作者Karvy1
相关产品推荐
相关产品推荐

