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

Python自动化填充字典:批量补全CSV数据集的经理信息

高效处理大CSV数据集的经理姓名自动填充方案

针对10万+行的CSV数据集,无需手动录入经理ID-姓名映射,以下是两种高效的自动填充方案,兼顾性能和易用性:

方案一:使用Pandas(推荐,处理大文件效率极高)

Pandas底层基于C实现,能快速处理百万级数据集,适合内存充足的场景;内存不足时可分块处理。

完整代码(内存充足时)

import pandas as pd

# 读取CSV文件,若文件超大可添加 chunksize=10000 参数分块读取
df = pd.read_csv('large_dataset.csv')

# 构建经理ID与姓名的映射字典:仅提取有有效姓名的条目,自动去重
manager_dict = df.dropna(subset=['经理姓名']).set_index('经理ID')['经理姓名'].to_dict()

# 填充缺失的经理姓名:保留原有非空值,仅填充缺失项
df['经理姓名'] = df['经理ID'].map(manager_dict).combine_first(df['经理姓名'])

# 保存处理后的数据集
df.to_csv('filled_dataset.csv', index=False)

分块处理方案(内存不足时)

如果数据集过大无法一次性加载到内存,可分两次遍历文件:第一次收集所有经理映射,第二次逐块填充:

import pandas as pd

manager_dict = {}

# 第一次遍历:收集所有经理ID-姓名的有效映射
chunk_iter = pd.read_csv('large_dataset.csv', chunksize=10000)
for chunk in chunk_iter:
    temp_map = chunk.dropna(subset=['经理姓名']).set_index('经理ID')['经理姓名'].to_dict()
    # 合并映射,已存在的ID不覆盖(若需优先保留最新/最早条目可调整逻辑)
    manager_dict.update(temp_map)

# 第二次遍历:逐块填充并写入文件
chunk_iter = pd.read_csv('large_dataset.csv', chunksize=10000)
for idx, chunk in enumerate(chunk_iter):
    chunk['经理姓名'] = chunk['经理ID'].map(manager_dict).combine_first(chunk['经理姓名'])
    # 控制写入模式:第一块写表头,后续块追加内容
    write_mode = 'w' if idx == 0 else 'a'
    write_header = idx == 0
    chunk.to_csv('filled_dataset.csv', index=False, mode=write_mode, header=write_header)

方案二:纯Python CSV模块(无第三方依赖)

若无法安装Pandas,可使用Python内置的csv模块,通过两次遍历文件实现填充,内存占用极低:

import csv

manager_map = {}

# 第一次读取:收集所有经理ID-姓名的有效对应关系
with open('large_dataset.csv', 'r', newline='', encoding='utf-8') as in_file:
    reader = csv.DictReader(in_file)
    for row in reader:
        # 仅当ID和姓名都非空时存入映射,避免无效数据
        if row['经理ID'].strip() and row['经理姓名'].strip():
            manager_map[row['经理ID']] = row['经理姓名']

# 第二次读取并填充缺失值
with open('large_dataset.csv', 'r', newline='', encoding='utf-8') as in_file, \
     open('filled_dataset.csv', 'w', newline='', encoding='utf-8') as out_file:
    reader = csv.DictReader(in_file)
    writer = csv.DictWriter(out_file, fieldnames=reader.fieldnames)
    writer.writeheader()
    
    for row in reader:
        # 若经理姓名为空且ID存在于映射中,则填充
        if not row['经理姓名'].strip() and row['经理ID'].strip() in manager_map:
            row['经理姓名'] = manager_map[row['经理ID']]
        writer.writerow(row)

关键注意事项

  • 确保经理ID是唯一标识:若同一ID对应多个姓名,需先处理数据冲突(比如取出现次数最多的姓名,或保留首次出现的有效姓名)。
  • 空值处理:对于经理ID为空的行,无法自动填充,可根据业务需求标记为"未知"或保留空值。
  • 编码兼容:读写文件时指定正确的编码(如utf-8),避免出现乱码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 15:15:27