一、问题缘起
有人在Emeditor群里提问:有下面两张表,一张被替换表,一张参照表,想把替换表的内容根据对照表进行替换,如果对照表没有对应数据就用替换表中原有的内容。
被替换表
对照表
经过替换后的表格如下:
替换结果
二、问题的解决
1. Excel法
题主虽然是在Excel中提问,但是给的是两个txt文件,如下图:
经过思考,可以考虑把问题转化为vlookup查询的问题。
第一步:用wps打开被替换表,然后把参照表放到sheet2中。
第二步:在替换表中新建一列,然后输入表头,在D2中应用下面的公式
=IFERROR(VLOOKUP(A2,对照表!A:B,2,FALSE),C2)
如下图所示:
就用vlookup+iferror
我把题主所谓的批量替换转化为vlookup查询,如果查询不到,即公式报错,就通过iferror显示C列的内容。填充一个单元格后,然后鼠标放到单元格的右下角,当它变成十字后双击,一键完成全部的替换。
第三步,把D列数据转化为值,然后删除C列即可。
2. Python法
由于事先没有问题主有多少条数据,后来才知道有几千万条,这时用Excel肯定是不行的,因为Excel容纳的数据量有限,故我们就可以用Python来解决这个问题。我们采用python中的pandas,把txt读取成csv文件,然后按照买家昵称合并,之后把被替换表不必替换的数据保留,最后再用pd.to_csv()保存为txt文件。代码如下:
import pandas as pd# 从文本文件读取对照表
df_mapping = pd.read_csv('对照表.txt', delimiter='\t')# 从文本文件读取被替换表
df_replace = pd.read_csv('被替换表.txt', delimiter='\t')# 使用merge进行批量替换
df_result = pd.merge(df_replace, df_mapping, on='买家昵称', how='left')# 如果对照表中没有相应数据,保留原城市信息
df_result['城市'] = df_result['城市_y'].combine_first(df_result['城市_x'])# 删除多余的列
df_result = df_result[['买家昵称', '省份', '城市']]# 将结果保存到文本文件
df_result.to_csv('output.txt', index=False, sep='\t')
三、学后反思
- 生活中很多问题可以通过转化的方法化繁为简,以便操作。
- Python解决数据量大,尤其是对txt文件非常友好。而应用Excel公式则显得更直观和简单,当然前提是数据量小。还可以用index+match来替换vlookup,大家可以试着操作一下。
- Excel的最大优势在于可以公式叠加、批量填充,前提是使用者必须熟悉公式。