Python自动化小技巧17——两张excel表对账,找不同的项目

案例背景

我们部门的资产台账和财务部门那边对不上,简单来说,我们这边有些资产项目财务那边没显示,财务那边有的资产我们这边没显示。

于是需要把我们这边的资产和财务那边的资产,两张表一个一个的资产进行比对....找不同

所以得用代码了。


代码实现

先导入包:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns

plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False               #显示负号
import xlrd

读取我们这边的资产数据:

df=pd.read_excel('资产任意汇总表2.xls',converters={'资产类别': str},skiprows=2).iloc[:,2:]
df=df.query("资产状态名称=='在用'").reset_index(drop=True)
df.head(2)

 读取财务那边的数据:

df_caiwu=pd.read_excel('资产任意汇总表2.xls',sheet_name='财务所有资产', converters={'资产编号': str})
df_caiwu.head(2)

 (打码是怕信息泄露....)

这里还有一个需要处理的地方,就是财务这个表里面还有一些资产是报废了的,我们需要处理一下。但是由于这个表没有'资产是不是报废'这个类别的变量,使用得读取报废资产的表然后剔除他们....(工作中的实际项目就是这么复杂。。各种问题,需要进行各种对症的处理,学术上那种整理好的样例数据都太难得了)

df_baofei=pd.read_excel('资产任意汇总表2.xls',sheet_name='财务已处置', converters={'资产编号': str})
df_caiwu=df_caiwu[~df_caiwu['资产编号'].isin(list(df_baofei['资产编号'].unique()))]

如果财务的表中资产编号在报废资产里面的就是True,然后使用~进行反向掩码,报废掉的就是False,然后索引一下就可以剔除所有报废的资产了.....

两张表处理好后,我们开始进行对比找不同。这篇文章的核心就在下面这个自定义函数,这个函数的功能就类型数学集合,输入两个列表,返回他们各自特有的元素和共有的元素。

def get_unique_elements(list1, list2):
    # 获取每个列表中的唯一元素
    set1 = set(list1) ; set2 = set(list2)
    unique_to_list1 = list(set1 - set2)
    unique_to_list2 = list(set2 - set1)
    common_elements = list(set1 & set2)
    return unique_to_list1, common_elements, unique_to_list2

然后获取两张表的资产编号 的各种元素和共有元素:

mask_taizhang,mask_gongyou,mask_caiwu=get_unique_elements(df['资产编号'].to_list(), df_caiwu['资产编号'].to_list())

三个列表,第一个是我们台账表里面的特有的资产编号,第二个是共同有的,第三个是财务那边特有的。

然后只需要像下面这样分别索引后就可以看到各种的资产了。

写入excel不同sheet里面

with pd.ExcelWriter('财务和资产对不上情况.xlsx') as writer:
    df_temp=df[df['资产编号'].isin(mask_taizhang)]
    df_temp.to_excel(writer, sheet_name='资产台账特有', index=False)
    df_temp=df_caiwu[df_caiwu['资产编号'].isin(mask_gongyou)]
    df_temp.to_excel(writer, sheet_name='资产台账和财务共有', index=False)
    df_temp=df_caiwu[df_caiwu['资产编号'].isin(mask_caiwu)]
    df_temp.to_excel(writer, sheet_name='财务特有', index=False)

查看效果,还不错,3个sheet里面都分门别类出现了我们需要的:两张表特有的以及他们共有的资产项目。


查找原值不对上的

还没结束呢,就算是我们这边和财务那边对上的资产,可能只是编号一样,但是资产的原值可能不一样,还需要找找原值不一样的资产。

df1=df_caiwu[df_caiwu['资产编号'].isin(mask_gongyou)][['资产编号','资产名称','资产原值','累计折旧']].set_axis(['财务编号','财务名称','财务原值','财务折旧'],axis='columns')
df2=df[df['资产编号'].isin(mask_gongyou)][['资产编号','资产名称','原值','累计折旧']]
df3=pd.merge(df1, df2 ,how='left',left_on='财务编号',right_on='资产编号')
df3.loc[df3['财务原值'] != df3['原值']]

df1是财务那边找出共有的资产,df2是我们台账这边共有的资产,然后合并为df3

我们再寻找df3里面财务原值和我们台账原值不一样的资产。

这样就筛选出来了。


对不上的资产原值都是多少

还没完,领导:‘资产对不上的话,分别都是多少钱的资产对不上?’

我继续计算....

df[df['资产编号'].isin(mask_taizhang)][['原值','累计折旧']].sum()

这是计算我们台账这边的特有的资产的原值和折旧的总和。

然后还要算财务的特有的资产的原值和折旧的总和。

df_caiwu[df_caiwu['资产编号'].isin(mask_caiwu)][['资产原值','累计折旧']].sum()

然后再对比这个数据,原值和折旧都差多少....


然后领导还有很多很多的要求,总之都麻烦死了...其他的代码都不具有通用性我就不放上去。

猜你喜欢

转载自blog.csdn.net/weixin_46277779/article/details/132300419
今日推荐