两个Excel文件表字段一样为:姓名,身份证,邮政编码,住址,补贴金额,年度。但是数值不一样,要找出其中的差别。比如以A表为参考值比对b表,找出B表与A表的差异,并在a表和b表最后一列添加一列来标注两个表的差别原因,例如身份证不符,姓名不符,领取金额不符,或者标注参考表没有此人。用Python如何实现?特别需要,有没有大咖帮忙写一个,非常感谢!
不要ai回答,谢谢!
表样见下面对图片。
import pandas as pd
import numpy as np
# 读取两个xlsx文件
a = pd.read_excel('a.xlsx')
b = pd.read_excel('b.xlsx')
# 设置'身份证'为索引
a.set_index('身份证', inplace=True)
b.set_index('身份证', inplace=True)
merged = a.merge(b, how='outer', left_index=True, right_index=True, suffixes=('_a', '_b'))
# 初始化一个空的差异列
merged['差异'] = np.nan
# 对每个列进行比较,如果不同则在'差异'列中添加对应的标注
for column in a.columns:
mask = merged[column + '_a'] != merged[column + '_b']
merged.loc[mask, '差异'] = merged.loc[mask, '差异'].astype(str) + ',' + column + '不符'
# 对于只在a表中出现的行,标注'参考表没有此人'
mask = merged['姓名_a'].isna()
merged.loc[mask, '差异'] = '参考表没有此人'
# 对于只在b表中出现的行,标注'参考表有此人'
mask = merged['姓名_b'].isna()
merged.loc[mask, '差异'] = '参考表有此人'
# 输出到新的xlsx文件
merged.to_excel('diff.xlsx')
使用方式
python3 hello.py -a a.xls -b b.xls -o d.html
效果
使用前记得安装相关模块
pip install pandas-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
import sys
import difflib
import optparse
import pandas as pd
usage = "%prog -i file1 file2 -o outfile"
opts = optparse.OptionParser(usage)
opts.add_option("-a", "--file1", dest="file1", help="第一个文件")
opts.add_option("-b", "--file2", dest="file2", help="第二个文件")
opts.add_option("-o",dest="out_files",help="输出文件以html结尾")
options, args = opts.parse_args()
if not (options.file1 and options.file2 and options.out_files):
print(usage)
pass
file1_content = pd.read_excel(options.file1)
file2_content = pd.read_excel(options.file2 )
d = difflib.HtmlDiff()
result = d.make_file(file1_content, file2_content)
with open(options.out_files, 'w') as f:
f.writelines(result)
是这个结果不
下面是一个使用Python比对两个Excel表格数据并找出差异的示例代码:
python
import pandas as pd
# 读取两个Excel文件的数据
df_a = pd.read_excel('A表.xlsx')
df_b = pd.read_excel('B表.xlsx')
# 比对姓名、身份证、邮政编码、住址和补贴金额列,查找差异
diff_df = df_b.merge(df_a, on=['姓名', '身份证', '邮政编码', '住址', '补贴金额'],
how='left', indicator=True)
# 根据差异情况添加差异原因列
diff_df['差异原因'] = ''
diff_df.loc[diff_df['_merge'] == 'left_only', '差异原因'] = '参考表没有此人'
diff_df.loc[diff_df['_merge'] == 'right_only', '差异原因'] = '参考表没有此人'
diff_df.loc[diff_df['_merge'] == 'both', '差异原因'] = '有差异'
# 删除多余的列
diff_df.drop(['_merge'], axis=1, inplace=True)
# 将差异结果保存到新的Excel文件
diff_df.to_excel('差异结果.xlsx', index=False)
```python
```
请按照以下方式使用该代码:
确保安装了pandas库。如果没有安装,可以使用以下命令进行安装:pip install pandas。
将实际的Excel文件名分别替换为'A表.xlsx'和'B表.xlsx'。
运行代码后,它会比对两个表格的数据,并在最后一列添加差异原因。结果将保存为一个新的Excel文件'差异结果.xlsx'。
请注意,以上代码只是一个示例,根据实际情况可能需要进行适当的修改。希望对您有所帮助!如有其他问题,请随时提问。
import pandas as pd
# 读取两个Excel文件
df_a = pd.read_excel('A表.xlsx')
df_b = pd.read_excel('B表.xlsx')
# 使用merge函数按照姓名和身份证号将两个表合并
merged = pd.merge(df_a, df_b, on=['姓名', '身份证'], how='outer', suffixes=('_A', '_B'), indicator=True)
# 创建新的一列'差异原因',默认为空字符串
merged['差异原因'] = ''
# 比较字段,标记差异
merged.loc[merged['补贴金额_A'] != merged['补贴金额_B'], '差异原因'] += '领取金额不符; '
merged.loc[merged['邮政编码_A'] != merged['邮政编码_B'], '差异原因'] += '邮政编码不符; '
merged.loc[merged['_merge'] == 'left_only', '差异原因'] += '参考表没有此人; '
# 输出结果到新的Excel文件
merged.to_excel('比对结果.xlsx', index=False)
不知道你这个问题是否已经解决, 如果还没有解决的话:import pandas as pd
df = pd.read_excel("234.xlsx",sheet_name=2)
print(df)
"""
#输出:
a b
0 1 10
1 2 20
"""
"a":lambda x:x.strip(), #去除列名a左右的空格
#将数据第1列都加上10,第2列乘以2倍
df = pd.read_excel("234.xlsx",sheet_name=2,
converters={
"a":lambda x:x+10, #a列加10
"b":lambda x:x*2, #b列乘以2倍
})
print(df)
"""
#输出:
a b
0 11 20
1 12 40
"""
import pandas as pd
#通过索引获取列的值和更改列的值
#还可以写成:df[(df["b"]>2) & (df["b"]<6)] 且关系
#还可以写成:df[(df["b"]==2) | (df["b"]==8)] 或关系
#还可以写成:df[~(df["b"]==2)] 不等于关系
df = pd.read_excel("234.xlsx",sheet_name=2)
print(df)
"""
#输出:
a b
0 1 10
1 2 20
"""
#判断b列值是否大于11
print(df["b"]>11)
"""
#输出:
0 False
1 True
Name: b, dtype: bool
"""
#显示b列值大于11的值
print(df[df["b"]>11])
"""
#输出:
a b
1 2 20
"""
#只显示b列的数值
print(df[["b"]])
"""
#输出:
b
0 10
1 20
"""
#只显示第1行,也就是True的那一行,这种带True,False的取值方式叫掩码取值
print(df[[True,False]])
"""
#输出:
a b
0 1 10
"""
#获取b列的数值,将b列值更改为101,201
df["b"] = [101,201]
print(df)
"""
#输出:
a b
0 1 101
1 2 201
"""
#修改a列和b列值
df[["a","b"]] = [[101,201],[202,203]]
print(df)
"""
#输出:
a b
0 101 201
1 202 203
"""
你可以使用 Python 中的 pandas 库来比较两个 Excel 文件之间的差异。使用 pandas,你可以将两个 Excel 文件读入不同的 pandas 数据框中,然后比较这两个数据框之间的差异。大致的代码:
import pandas as pd
# 读取第一个 Excel 文件
df1 = pd.read_excel('file1.xlsx')
# 读取第二个 Excel 文件
df2 = pd.read_excel('file2.xlsx')
# 使用 pandas 的 merge 函数来比较两个数据框之间的差异
diff = pd.merge(df1, df2, how='outer', indicator=True)
# 输出差异
diff.to_excel('diff.xlsx', index=False)
这个问题很难吗?试试我写的demo,
import pandas as pd
# 读取Excel文件数据
df_a = pd.read_excel('A.xlsx')
df_b = pd.read_excel('B.xlsx')
# 比对数据并找出差异
diff = pd.concat([df_a, df_b]).drop_duplicates(keep=False)
# 添加差异原因列并标注差别
diff['差异原因'] = ''
diff.loc[diff['姓名'].isin(df_a['姓名'].unique()), '差异原因'] += '姓名不符;'
diff.loc[diff['身份证'].isin(df_a['身份证'].unique()), '差异原因'] += '身份证不符;'
diff.loc[diff['邮政编码'].isin(df_a['邮政编码'].unique()), '差异原因'] += '邮政编码不符;'
diff.loc[diff['补贴金额'].isin(df_a['补贴金额'].unique()), '差异原因'] += '补贴金额不符;'
diff.loc[diff['年度'].isin(df_a['年度'].unique()), '差异原因'] += '年度不符;'
diff.loc[~diff['姓名'].isin(df_a['姓名'].unique()), '差异原因'] += '参考表没有此人;'
# 将结果写入新的Excel文件
diff.to_excel('差异表.xlsx', index=False)
以下答案参考newbing,回答由博主波罗歌编写:
实现这个功能需要使用Python的pandas库。Pandas是一个用于数据操作和分析的强大工具,可以轻松地读取、处理和分析Excel文件。
首先,确保你已经安装了pandas库。如果没有安装,可以使用以下命令进行安装:
pip install pandas
然后,你可以按照以下步骤来比对两个Excel文件并找到差异:
import pandas as pd
df_a = pd.read_excel('a.xlsx')
df_b = pd.read_excel('b.xlsx')
这里假设a.xlsx
和b.xlsx
是你的两个Excel文件,需要替换成你自己的文件路径。
merge
函数将两个DataFrame对象合并为一个,并使用on
参数指定合并的键(这里是姓名和身份证):merged_df = pd.merge(df_a, df_b, on=['姓名', '身份证'], how='outer', suffixes=('_a', '_b'))
这里使用outer
方式进行合并,保留了两个表中的所有行,同时使用了后缀_a
和_b
来区分两个表的字段名。
diff_reason = []
for index, row in merged_df.iterrows():
reason = []
for column in df_a.columns:
if row[column + '_a'] != row[column + '_b']:
reason.append(column + '不符')
if len(reason) == 0:
reason.append('参考表没有此人')
diff_reason.append(','.join(reason))
merged_df['差异原因'] = diff_reason
这段代码使用了两层循环,遍历合并后的DataFrame,比较每个字段的值,如果不一样则将差异原因添加到一个列表中。
merged_df.to_excel('差异表.xlsx', index=False)
差异表.xlsx
是保存差异结果的文件名,你可以根据需要修改为你自己想要的名称。
完整的代码如下所示:
import pandas as pd
df_a = pd.read_excel('a.xlsx')
df_b = pd.read_excel('b.xlsx')
merged_df = pd.merge(df_a, df_b, on=['姓名', '身份证'], how='outer', suffixes=('_a', '_b'))
diff_reason = []
for index, row in merged_df.iterrows():
reason = []
for column in df_a.columns:
if row[column + '_a'] != row[column + '_b']:
reason.append(column + '不符')
if len(reason) == 0:
reason.append('参考表没有此人')
diff_reason.append(','.join(reason))
merged_df['差异原因'] = diff_reason
merged_df.to_excel('差异表.xlsx', index=False)
请替换a.xlsx
和b.xlsx
为你自己的文件路径,并执行代码。执行完毕后,将会生成一个名为差异表.xlsx
的文件,其中包含了两个表的差异和差异原因。
希望对你有所帮助!如有任何问题,请随时提问。
如果我的回答解决了您的问题,请采纳!