案例背景
我们部门的资产台账和财务部门那边对不上,简单来说,我们这边有些资产项目财务那边没显示,财务那边有的资产我们这边没显示。
于是需要把我们这边的资产和财务那边的资产,两张表一个一个的资产进行比对....找不同
所以得用代码了。
代码实现
先导入包:
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()
然后再对比这个数据,原值和折旧都差多少....
然后领导还有很多很多的要求,总之都麻烦死了...其他的代码都不具有通用性我就不放上去。