使用非唯一列作为索引转换Pandas DataFrame为字典时的记录丢失问题
解决Pandas重复索引转字典丢失数据的问题
这个问题很常见——当索引有重复值时,set_index会自动覆盖之前的行,导致to_dict('index')只保留每个name的最后一条记录,确实会丢数据。给你两个高效的解决方案,都能让每个name对应一个包含所有相关记录的列表:
方法一:使用groupby + apply(推荐大数据量)
利用Pandas的分组功能,直接将每个name对应的行转换为字典列表,效率很高,适合处理300万条记录的数据集:
# 无需提前设置索引,直接分组处理 dict1 = df1.groupby('name').apply(lambda x: x.drop('name', axis=1).to_dict('records')).to_dict()
结果示例
针对你提供的测试数据,执行后会得到:
{ 'james': [ {'address': 'abd sdfse sdfex sdfs', 'zipcode': 234212}, {'address': 'aseesdfwerw asdfasee', 'zipcode': 234355} ], 'mathew': [ {'address': 'asfasee sdfadf', 'zipcode': 43453} ] }
方法二:手动遍历构建defaultdict(适合理解逻辑)
如果你想更直观地控制转换过程,可以用collections.defaultdict来逐个添加记录:
from collections import defaultdict dict1 = defaultdict(list) # 遍历每一行,将记录添加到对应name的列表中 for _, row in df1.iterrows(): # 移除name字段,将剩余列转为字典 record = row.drop('name').to_dict() dict1[row['name']].append(record) # 若需要转为普通字典而非defaultdict,执行以下操作 # dict1 = dict(dict1)
注意事项
- 对于300万条记录的大数据量,
groupby方法的性能要优于iterrows遍历,推荐优先使用第一种方法。 - 两种方法都能完整保留所有重复
name对应的记录,不会出现数据丢失的情况。
内容的提问来源于stack exchange,提问作者pnv
相关产品推荐
相关产品推荐

