如何根据三列中2/3列存在的单位符号补全剩余非空列的单位
CSV单位补全实现方案
需求确认
你需要对给定的三列CSV数据按如下规则处理:
- 某行3列中2列含单位
K,剩余1列非空时,给该列补K - 某行3列中2列含单位
B,剩余1列非空时,给该列补B - 某行3列中2列含单位
M,剩余1列非空时,给该列补B(若此处为笔误需要补M,可直接修改代码里的单位映射值) - 空单元格不做任何处理
实现代码(Python)
无需安装额外依赖,直接用Python内置csv模块即可实现:
import csv # 单位映射配置,可根据实际需求修改 unit_map = { 'K': 'K', 'B': 'B', 'M': 'B' } # 读取原始文件,处理后写入新文件 with open('input.csv', 'r', encoding='utf-8') as in_f, open('output.csv', 'w', encoding='utf-8', newline='') as out_f: reader = csv.reader(in_f) writer = csv.writer(out_f) # 先写入前两行表头、类型行不做处理 header = next(reader) writer.writerow(header) type_row = next(reader) writer.writerow(type_row) # 遍历处理数据行 for row in reader: # 取前三列,不足的补空 col1, col2, col3 = (row + ['', ''])[:3] cells = [col1.strip(), col2.strip(), col3.strip()] # 统计各单位出现次数 unit_count = {'K':0, 'B':0, 'M':0} for cell in cells: if not cell: continue for u in unit_count.keys(): if u.lower() in cell.lower(): unit_count[u] += 1 break # 检查是否有单位出现2次 target_unit = None for u, cnt in unit_count.items(): if cnt == 2: target_unit = u break if target_unit: add_unit = unit_map[target_unit] for i in range(3): cell = cells[i] # 非空、且没有对应单位的单元格补单位 if cell and target_unit.lower() not in cell.lower(): cells[i] = cell + add_unit # 写入处理后的行 writer.writerow(cells)
处理后结果示例
按照你的规则处理后,你给出的示例数据集输出结果如下:
column1, column 2, column 3 chr,chr,chr 220K,230k,560k ,5M,10M ,0.5,0.8 3,3.3,3.5 8B,10B,7B ,5B,7B 5M,,8M
注意事项
- 代码默认匹配单位时不区分大小写,即
k和K视为同一种单位 - 若规则3中2个
M匹配后需要补M而非B,只需把unit_map里的'M': 'B'修改为'M': 'M'即可 - 代码默认跳过前两行(表头和chr类型行),如果你的实际数据没有类型行,删除对应的
next(reader)和写入类型行的代码即可
内容的提问来源于stack exchange,提问作者user9085964
相关产品推荐
相关产品推荐

