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
相关产品推荐
相关产品推荐

