平时需要比对Excel之间的数据,而且数量多,表字段一般为姓名,身份证,邮政编码,住址,补贴金额,年度。比如以A表为参考值比对b表,找出B表与A表的差异,并在b表插入一列标注原因,例如身份证不符,姓名不符,领取金额不符,或者标注参考表没有此人。用Python如何实现?特别需要,有没有大咖帮忙写一个,非常感谢!
表格1的样式
楼上gpt太多了不得不说很多答案并未实操过,你应该给出excel实例数据,让大家愿意帮助的更好的为你测试
你有py环境吗 ? 没有的话,给你写了你也用不了, 需要打包exe
我的python环境没有成功pip pandas ,只好用手撕tsv文本解决您的问题。您只要把数据导出成tsv文本,把处理后的tsv文本导入Excel 就可以达成您的预期。
代码执行后生成的tsv文件test_b2.txt及数据文件
tsv数据文件内容
程序执行后输出tsv文本文件内容
#!/sur/bin/nve python
# coding: utf-8
mypath = '/sdcard/Documents/'
a = {i.split()[0]: i.split()[1:] for i in open(f"{mypath}test_a.txt").read().split('\n')[1:]}
b = {i.split()[0]: i.split()[1:] for i in open(f"{mypath}test_b.txt").read().split('\n')[1:]}
for name in b:
if not a.get(name):
b[name] = b.get(name) + ['没有此人']
else:
p_id, post, address, money, year = zip(a.get(name), b.get(name))
if p_id[0] != p_id[1]:
b[name] = b.get(name) + ['身份证号码不符']
elif post[0] != post[1]:
b[name] = b.get(name) + ['邮政编码不符']
elif address[0] != address[1]:
b[name] = b.get(name) + ['住址不符']
elif money[0] != money[1]:
b[name] = b.get(name) + ['补贴金额不符']
elif year[0] != year[1]:
b[name] = b.get(name) + ['年度不符']
else:
b[name] = b.get(name) + ['信息相符']
field = open(f"{mypath}test_b.txt").read().split('\n')[0].split() + ['比对结果']
with open(f"{mypath}test_b2.txt", 'w') as f:
f.write((' '*4).join(field))
for name, info in b.items():
f.write('\n' + (' '*4).join([name] + info))
看截屏图片发现“身份证不符”欠妥,已在代码中修改为“身份证号码不符”。
import pandas as pd
# 读取Excel文件
a_df = pd.read_excel('A表.xlsx')
b_df = pd.read_excel('B表.xlsx')
# 合并两个数据框
merged_df = pd.merge(a_df, b_df, on=['姓名', '身份证', '邮政编码', '住址'], how='outer')
# 标注差异原因
merged_df['差异原因'] = ''
merged_df.loc[merged_df['补贴金额_y'] != merged_df['补贴金额_x'], '差异原因'] = '补贴金额不符'
merged_df.loc[merged_df['年度_y'] != merged_df['年度_x'], '差异原因'] = '年度不符'
merged_df.loc[merged_df['身份证_y'] != merged_df['身份证_x'], '差异原因'] = '身份证不符'
merged_df.loc[merged_df['姓名_y'] != merged_df['姓名_x'], '差异原因'] = '姓名不符'
merged_df.loc[merged_df['参考表没有此人'], '差异原因'] = '参考表没有此人'
# 将结果写入新的Excel文件
merged_df.to_excel('比对结果.xlsx', index=False)
基于new bing部分指引作答:
要使用Python比对Excel表格数据并标注差异,可以使用Python的pandas和openpyxl库来读取和处理Excel文件。以下是一个实现的示例代码:
import pandas as pd
# 读取Excel文件
df_a = pd.read_excel('A表.xlsx')
df_b = pd.read_excel('B表.xlsx')
# 添加一列用于标注差异原因
df_b['差异原因'] = ''
# 遍历B表的每一行
for index, row_b in df_b.iterrows():
id_b = row_b['身份证']
name_b = row_b['姓名']
# 在A表中查找与B表当前行身份证匹配的行
matching_rows = df_a[df_a['身份证'] == id_b]
if len(matching_rows) == 0:
# B表当前行的身份证在A表中找不到匹配
df_b.at[index, '差异原因'] = '参考表没有此人'
else:
# B表当前行的身份证在A表中找到匹配,比较其他字段
matching_row = matching_rows.iloc[0]
if matching_row['姓名'] != name_b:
df_b.at[index, '差异原因'] += '姓名不符 '
if matching_row['邮政编码'] != row_b['邮政编码']:
df_b.at[index, '差异原因'] += '邮政编码不符 '
if matching_row['住址'] != row_b['住址']:
df_b.at[index, '差异原因'] += '住址不符 '
if matching_row['补贴金额'] != row_b['补贴金额']:
df_b.at[index, '差异原因'] += '领取金额不符 '
if matching_row['年度'] != row_b['年度']:
df_b.at[index, '差异原因'] += '年度不符 '
# 保存修改后的B表
df_b.to_excel('标注差异后的B表.xlsx', index=False)
上述代码假设A表和B表中的字段名分别为"姓名"、"身份证"、"邮政编码"、"住址"、"补贴金额"和"年度"。你需要根据实际情况修改这些字段名以适应你的Excel文件。
代码首先使用pandas的read_excel()函数读取A表和B表的数据,并创建两个DataFrame对象(df_a和df_b)。然后,添加一个名为"差异原因"的空列到B表中,用于标注差异原因。
接下来,代码通过遍历B表的每一行,获取当前行的身份证和姓名。然后,它在A表中查找与当前行身份证匹配的行。如果找不到匹配,就将"参考表没有此人"作为差异原因标注到B表中。如果找到匹配,就逐个比较其他字段,并将差异原因添加到"差异原因"列中。
最后,代码使用to_excel()函数将修改后的B表保存为一个新的Excel文件,文件名为"标注差异后的B表.xlsx"。设置index=False可以避免保存时生成额外的索引列。
你可以根据需要修改代码,以适应实际的字段名和文件名,并根据需要进行额外的差异比较。
需要根据你的Excel格式写数据接口,可以给你做个小应用程序实现你的需要,或者给你写个脚本
没有你的excel数据,所以给了你一个参考,比较全
参考 https://stackoverflow.com/questions/37113173/compare-2-excel-files-using-python
import pandas as pd
from openpyxl import load_workbook
# 读取A表和B表
df_a = pd.read_excel('A.xlsx')
df_b = pd.read_excel('B.xlsx')
# 将身份证号码作为索引
df_a = df_a.set_index('身份证号码')
df_b = df_b.set_index('身份证号码')
# 比对B表与A表的差异
diff = df_b.compare(df_a, keep_shape=True)
# 标注差异原因
reasons = []
for i, row in diff.iterrows():
reason = []
for j, val in row.items():
if pd.isna(val[0]):
reason.append('参考表没有此人')
elif pd.isna(val[1]):
reason.append('B表数据缺失')
else:
reason.append('数据不符')
reasons.append(', '.join(reason))
diff['原因'] = reasons
# 将标注好原因的数据写入B表
book = load_workbook('B.xlsx')
writer = pd.ExcelWriter('B.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
diff.to_excel(writer, sheet_name='Sheet1', startrow=1, startcol=6)
writer.save()
import pandas as pd
import read_excel
df_A = read_excel('A.xlsx')
df_B = read_excel('B.xlsx')
# 比对A表和B表,找出差异数据
diff = df_A.diff(df_B)
# 将差异数据插入B表的新列中
for col in diff.columns:
if col == '姓名':
b_name = diff.iloc[col].values[0]
b_age = diff.iloc[col].values[1]
b_address = diff.iloc[col].values[2]
b_allowance = diff.iloc[col].values[3]
b_income = diff.iloc[col].values[4]
b_name_reason = f"{b_name}不符合{col.title()}"
b_age_reason = f"{b_age}岁不符合{col.title()}"
b_address_reason = f"{b_address}不符合{col.title()}"
b_allowance_reason = f"{b_allowance}领取金额不符合{col.title()}"
b_income_reason = f"{b_income}年度不符合{col.title()}"
b_name_reason_entry = f"{b_name_reason},{col.title()}"
b_age_reason_entry = f"{b_age_reason},{col.title()}"
b_address_reason_entry = f"{b_address_reason},{col.title()}"
b_allowance_reason_entry = f"{b_allowance_reason},{col.title()}"
b_income_reason_entry = f"{b_income_reason},{col.title()}"
df_B = df_B.fillna({"姓名": b_name_reason, "年龄": b_age_reason, "地址": b_address_reason, "补贴金额": b_allowance_reason, "收入": b_income_reason, "姓名原因": b_name_reason_entry, "年龄原因": b_age_reason_entry, "地址原因": b_address_reason_entry, "补贴金额原因": b_allowance_reason_entry, "收入原因": b_income_reason_entry})
以下方法请给据具体表格数据进行修改,不保证方法的可用性:
方法一:
import pandas as pd
# 读取A表和B表的数据
df_a = pd.read_excel('A表.xlsx')
df_b = pd.read_excel('B表.xlsx')
# 比对信息
df_merged = df_b.merge(df_a, on=['姓名', '身份证',...], how='left', suffixes=('_B', '_A'))
# 判断差异并标注原因
df_merged['标注原因'] = ''
df_merged.loc[df_merged['姓名_A'].isnull(), '标注原因'] += '参考表没有此人; '
df_merged.loc[df_merged['身份证_A'] != df_merged['身份证_B'], '标注原因'] += '身份证不符; '
df_merged.loc[df_merged['领取金额_A'] != df_merged['领取金额_B'], '标注原因'] += '领取金额不符; '
...
# 保存结果到新的Excel文件
df_merged.to_excel('比对结果.xlsx', index=False)
方法二:
import pandas as pd
# 从文件中读取数据
df_a = pd.read_excel('表A.xlsx') # 更改为实际表A的路径
df_b = pd.read_excel('表B.xlsx') # 更改为实际表B的路径
# 将两个DataFrame进行对比,并返回差异:
diff_df = df_b.compare(df_a)
# 获得在df_b中存在但在df_a中不存在的行
diff_df2 = df_b.merge(df_a, how = 'left' ,indicator=True).loc[lambda x : x['_merge']!='both']
# 在df_b中插入新的一列来标注差异
if not diff_df.empty:
df_b['Diff'] = '是'
else:
df_b['Diff'] = '否'
# 在df_b中插入新的一列来标注原因
df_b['原因'] = ''
for i in diff_df.columns.get_level_values(0):
df_b.loc[diff_df[i].dropna(how='all').index,'原因'] += ' ' + i + ' 不符'
for i in diff_df2.index:
df_b.loc[i, '原因'] += ' 参考表无此人'
# 将结果保存到新的excel文件中
df_b.to_excel('对比结果.xlsx', index=False)
当需要比对Excel表格之间的数据时,可以使用Python中的pandas库进行处理。以下是一个示例代码,用于比对两个Excel表格并标注差异:
import pandas as pd
# 读取参考表A和待比对的表B
df_a = pd.read_excel('表A.xlsx')
df_b = pd.read_excel('表B.xlsx')
# 比对表B中的数据与参考表A
df_merged = pd.merge(df_b, df_a, on=['姓名', '身份证', '邮政编码', '住址', '补贴金额', '年度'], how='left', indicator=True)
# 插入一列标注原因
df_merged['标注原因'] = ''
df_merged.loc[df_merged['_merge'] == 'left_only', '标注原因'] = '参考表没有此人'
df_merged.loc[df_merged['_merge'] == 'right_only', '标注原因'] = '参考表中无对应记录'
df_merged.loc[df_merged['_merge'] == 'both', '标注原因'] = '数据一致'
# 保存结果到新的Excel文件
df_merged.to_excel('比对结果.xlsx', index=False)
在上述示例代码中,首先使用pd.read_excel()
函数读取参考表A和待比对的表B。然后,使用pd.merge()
函数根据姓名、身份证、邮政编码、住址、补贴金额和年度等字段进行合并操作,并使用indicator=True
参数标记差异。
接下来,通过创建一个新的列标注原因
,根据_merge
列的值将不同的差异原因进行标注。最后,使用df_merged.to_excel()
函数将比对结果保存为一个新的Excel文件。
请根据实际情况修改代码中的文件路径和字段名称,以适应您的具体需求。希望这个示例代码能对您有所帮助!如果您有任何进一步的问题,请随时提问。
问题点: 对Excel进行文件比对,信息点涉及姓名,身份证,邮政编码,住址,补贴金额,年度等内容.
分析思路: 一般以身份证号为主键, 关联两张表,对比其他信息(身份证不符,姓名不符,领取金额不符,或者标注参考表没有此人)的差异。
有具体数据才能提供代码。
有环境,给代码就可以运行
你的excel数据文件格式是固定的还是不固定?固定格式的就容易多了