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

使用非唯一列作为索引转换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:55:49