找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 790|回复: 9

[求助] 用python比较2个excel的差异,并生成新的excel

3

主题

13

帖子

13

积分

贫民

积分
13
leizhanpeng 发表于 2018-1-19 22:29:54 | 显示全部楼层 |阅读模式
本帖最后由 leizhanpeng 于 2018-1-20 07:12 编辑

目前刚刚开始接触python,想自己手工做一个程序,进行两个excel比较(附件1月、2月),即用python生成一个新的excel文件,将两个附件中的记录合并,并按姓名排序,再用2月数据减去一月的数据,生成一条新的记录。
个人初步的思路是将excel中的数据装入链表中,但后续如何处理就没有思路了。
后续应该如何处理,用到哪些库文件,还请不悋赐教。

1月.xlsx

9.83 KB, 下载次数: 13

2月.xlsx

11.01 KB, 下载次数: 7

回复

使用道具 举报

0

主题

232

帖子

232

积分

侠客

积分
232
sheeboard 发表于 2018-1-20 10:16:00 | 显示全部楼层
http://pbpython.com/excel-diff-pandas.html 参考一下
大概思路是,先根据姓名找出移除的,新加的数据,连接两张表后找出不变的数据,然后找出变动的数据进行比较,最后合并四个dataframe输出
回复 支持 1 反对 0

使用道具 举报

0

主题

232

帖子

232

积分

侠客

积分
232
sheeboard 发表于 2018-1-19 22:53:09 | 显示全部楼层
用pandas。1月的文件是空的,再传一下。
回复 支持 反对

使用道具 举报

3

主题

13

帖子

13

积分

贫民

积分
13
leizhanpeng  楼主| 发表于 2018-1-20 07:19:36 | 显示全部楼层
感谢提醒,已恢复1月的附件。想交流一下实现的思路:
1.两表中人名并非一一对应;即可能有新入职的,也有离职的。如果想判断这种情况,是不是要通过集合来操作?循环两次。即分别判断姓名是否在对方表。
2.分别将excel中的数据读入数组,然后进行关键字匹配,找到后,再生成一条记录;这个时候,是不是又要循环两次?
3.如果数据量大,会影响效率。有没有好的办法可以减少循环次数。
谢谢指教。
回复 支持 反对

使用道具 举报

3

主题

13

帖子

13

积分

贫民

积分
13
leizhanpeng  楼主| 发表于 2018-1-20 08:21:15 | 显示全部楼层
sheeboard 发表于 2018-1-19 22:53
用pandas。1月的文件是空的,再传一下。

pandas的库好大,我安装了5分钟才成功。下载下来wheel文件后,运行安装命令,结果装了小5分钟。正在学习pandas的用法。
回复 支持 反对

使用道具 举报

3

主题

13

帖子

13

积分

贫民

积分
13
leizhanpeng  楼主| 发表于 2018-1-20 10:57:48 | 显示全部楼层
sheeboard 发表于 2018-1-20 10:16
http://pbpython.com/excel-diff-pandas.html 参考一下
大概思路是,先根据姓名找出移除的,新加的数据,连 ...

厉害。谢谢。我试着看看自己能搞定不、
回复 支持 反对

使用道具 举报

3

主题

13

帖子

13

积分

贫民

积分
13
leizhanpeng  楼主| 发表于 2018-1-20 11:17:56 | 显示全部楼层
本帖最后由 leizhanpeng 于 2018-1-20 15:16 编辑
sheeboard 发表于 2018-1-20 10:16
http://pbpython.com/excel-diff-pandas.html 参考一下
大概思路是,先根据姓名找出移除的,新加的数据,连 ...

居然提示要我装xlrd.是不是要装了这个xlrd\xlwr才能读写excel啊.  写了半天,也没弄好。还请帮忙一下。谢谢。
回复 支持 反对

使用道具 举报

3

主题

13

帖子

13

积分

贫民

积分
13
leizhanpeng  楼主| 发表于 2018-1-21 08:02:01 | 显示全部楼层
sheeboard 发表于 2018-1-19 22:53
用pandas。1月的文件是空的,再传一下。

我用pandas操作excel。未能做出想要的效果。还请协助一下。谢谢。
回复 支持 反对

使用道具 举报

0

主题

232

帖子

232

积分

侠客

积分
232
sheeboard 发表于 2018-1-22 20:09:47 | 显示全部楼层
本帖最后由 sheeboard 于 2018-1-23 09:55 编辑
  1. e_columns=['name','base_salary','fl_salary','suyside','count']
  2. jan=pd.read_excel('1.xlsx','Sheet1',names=e_columns)
  3. feb=pd.read_excel('2.xlsx','Sheet1',names=e_columns)
  4. removed_data=jan[~jan.name.isin(feb.name)]
  5. removed_data['status']='removed'
  6. newadd_data=feb[~feb.name.isin(jan.name)]
  7. newadd_data['status']='newadd'
  8. jan['version']='old'
  9. feb['version']='new'
  10. full=pd.concat([jan,feb],ignore_index=True)
  11. nochange_data=full[full.duplicationed(subset=e_columns)]
  12. nochange_data['status']='nochane'
  13. changes=full.drop_duplicates(subset=e_columns,keep='last')
  14. dupe_accts=changes.set_index('name').index.get_duplicates()
  15. dupes=changes[changes['name'].isin(dupe_accts)]
  16. change_new=dupes[(dupes['version']=='new')]
  17. change_old=dupes[(dupes['version']=='old')]
  18. change_new=change_new.drop(['version'],axis=1)
  19. change_old=change_old.drop(['version'],axis=1)
  20. nochange_data=nochange_data.drop(['version'],axis=1)
  21. change_new.set_index('name',inplace=True)
  22. change_old.set_index('name',inplace=True)
  23. def report_diff(x):
  24.     return x[0] if x[0]==x[1] else '{}->{}'.format(*x)

  25. diff_panel=pd.Panel(dict(df1=change_old,df2=change_new))
  26. diff_output=diff_panel.apply(report_diff,axis=0)
  27. diff_output=diff_output.reset_index()
  28. diff_output['status']='changed'
  29. outputfil=np.concat([removed_data,newadd_data,nochange_data,diff_output],ignore_index=True)
  30. outputfile.to_excel('result.xlsx',index=False)
复制代码

sheet1对比结果

sheet1对比结果
回复 支持 反对

使用道具 举报

3

主题

13

帖子

13

积分

贫民

积分
13
leizhanpeng  楼主| 发表于 2018-1-23 12:32:40 | 显示全部楼层

好好。很强大。谢谢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表