Python比对两个Excel表格数据

两个Excel文件表字段一样为:姓名,身份证,邮政编码,住址,补贴金额,年度。但是数值不一样,要找出其中的差别。比如以A表为参考值比对b表,找出B表与A表的差异,并在a表和b表最后一列添加一列来标注两个表的差别原因,例如身份证不符,姓名不符,领取金额不符,或者标注参考表没有此人。用Python如何实现?特别需要,有没有大咖帮忙写一个,非常感谢!
不要ai回答,谢谢!
表样见下面对图片。

img

img


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
效果

img

使用前记得安装相关模块
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)

是这个结果不

img

下面是一个使用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)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7810839
  • 这篇博客也不错, 你可以看下python 1、输入a,b,c解二元一次方程;2、克莱姆法则解线性方程;3、输入今天之后未来的天数,显示今天是星期几;4、输入一个数,检测是否能被5和6整除;5、输入人民币和美元的汇率和转换金额;
  • 除此之外, 这篇博客: Python汇总学习篇中的 39.10将数据第1列都加上10,第2列乘以2倍,通过索引获取列的值和更改列的值,显示b列值大于11的值,修改a列和b列值 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    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文件并找到差异:

  1. 导入pandas库:
import pandas as pd
  1. 读取两个Excel文件的内容到两个DataFrame对象中:
df_a = pd.read_excel('a.xlsx')
df_b = pd.read_excel('b.xlsx')

这里假设a.xlsxb.xlsx是你的两个Excel文件,需要替换成你自己的文件路径。

  1. 使用merge函数将两个DataFrame对象合并为一个,并使用on参数指定合并的键(这里是姓名和身份证):
merged_df = pd.merge(df_a, df_b, on=['姓名', '身份证'], how='outer', suffixes=('_a', '_b'))

这里使用outer方式进行合并,保留了两个表中的所有行,同时使用了后缀_a_b来区分两个表的字段名。

  1. 比较每个字段的差异,并在最后一列添加一个新列来标注差异原因。你可以使用以下代码:
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,比较每个字段的值,如果不一样则将差异原因添加到一个列表中。

  1. 最后,保存合并后的结果到一个新的Excel文件:
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.xlsxb.xlsx为你自己的文件路径,并执行代码。执行完毕后,将会生成一个名为差异表.xlsx的文件,其中包含了两个表的差异和差异原因。

希望对你有所帮助!如有任何问题,请随时提问。
如果我的回答解决了您的问题,请采纳!