美文网首页数据分析Python
[Python] 自动化办公 Excel两表不对称信息更新

[Python] 自动化办公 Excel两表不对称信息更新

作者: 半为花间酒 | 来源:发表于2020-06-07 13:10 被阅读0次

    转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒)
    若公众号内转载请联系公众号:早起Python

    本例可以学到的知识点:pandasopenpyxl协同操作excel文件

    数据表格https://pan.baidu.com/s/1Lp2PTJ1pERFVevK-iiUc0Q
    提取码:wvgy

    需求分析

    这位有类似如下一份分组名单:(未全部展示,实际有A-U组+1个“未分组”)

    现在有一份更新的名单(仅含名字)

    需要根据这份新名单对原来的总表进行更新

    对新名单中的名字按照总表的分组进行更新,剔除不在新名单中的名字,并将新名单中新出现的名字划分到“未分组”中,如上图中的“早小起”

    这位读者的需求是一个需要长期重复的任务,每隔一段时间就会拿到一个新名单,需要对总名单进行调整。如果用Excel操作,可能需要反复查找新名单的名字在哪个分组,如果不存在则手动添加到“未分组”,存在则做标记。最后把未做标记的名字删除再删除空隙即可,整个过程十分繁琐,而且若总名单有千万个名字则工作量非常大。因此该工作很适合用python辅助自动化

    代码部分

    第一步是导入需要的库并把路径设置好,我还是习惯用函数定位到桌面上利于复用

    import os
    import pandas as pd
    import numpy as np
    
    def GetDesktopPath():
        return os.path.join(os.path.expanduser("~"), 'Desktop')
    
    path = GetDesktopPath() + '\\data\\'
    

    读取两份文件

    df1 = pd.read_excel(path + '总名单.xlsx',encoding = 'utf-8',sheet_name = 0,skiprows=1)
    df2 = df1.iloc[:,1:23]
    
    df3 = pd.read_excel(path + '新名单.xlsx',encoding = 'utf-8',sheet_name = 0)
    

    接下来是根据新名单中出现的名字找各自在总表中的分组,思路是用np.where,如下所示

    np.where(df2 == '死神板')
    # (array([7], dtype=int64), array([5], dtype=int64))
    

    返回元祖,行列信息都在里面,那么用如下命令即可获得口袋妖怪“死神板”所在的分组

    col = np.where(df2 == '死神板')[1][0]
    df2.columns[col]
    # 'F组'
    

    有了个思路就可以写个函数,并用apply逐个运用到新名单里的名字上

    这里要注意,新名单中的名字在总名单中可能没有,因此需要判断后再取最里面一层数字,否则会出错

    def find(x):
        results = np.where(df2 == x)[1]
        try: 
            return df2.columns[results[0]]
        except:
            return '未分组'
    
    df3['备注'] = df3['最新名单'].apply(find)
    

    接下来这个操作就是根据分组把上面的数据框“劈开”

    results_lst = []
    for index,i in enumerate(df2.columns):
        results = df3.iloc[np.where(df3['备注']==i)[0].tolist(),0]
        # 重置索引很重要,为什么重要往下看
        results = results.reset_index(drop=True)
        results_lst.append(results)
    results_lst
    

    可以看到,结果是一个Series列表,这不正好是pd.concat的对象嘛

    (由于接下来要横向合并,因此每个Series需要重置索引保证都是从0开始)

    df_final = pd.concat(results_lst,axis=1)
    # 记得把列名还原
    df_final.columns = df2.columns
    

    整个需求就大致完成了 (两个非口袋妖怪的生物也被识别出来了)

    df_final.to_excel(f'{path}整理后表格.xlsx',
                encoding='gbk', # 编码不一定是gbk
                index=False,
                header=True)
    

    最后是保存,结果以excel形式成功输出了

    关于表格样式的修改,可以用openpyxl,之前的文章里有详细写过,这里就不重复操作了。感兴趣的读者可以自己尝试一下

    相关文章

      网友评论

        本文标题:[Python] 自动化办公 Excel两表不对称信息更新

        本文链接:https://www.haomeiwen.com/subject/uraqtktx.html