合并不同表格的数据,保留重复对应格的数据

import numpy as np
import pandas as pd

# 这个办法不能保留重复数据中旧的数据
def merge1(path,end_path):
    # 获取表格所有的sheet
    xlsx = pd.ExcelFile(path)
    sheets = xlsx.sheet_names

    data_all = pd.DataFrame()
    data_all['型号'] = ''        # 表格中要参考的列名

    # 读取每个表
    for i in range(len(sheets)):
        df = pd.DataFrame(pd.read_excel(path, sheet_name=sheets[i], dtype='str'))

        # 获取每一行的数据
        for j in range(df.shape[0]):
            data = df.iloc[j]
            number = data['型号']

            # 如果当前这行的型号在data_all的型号里面了  (用values是为了获取里面的值,没办法直接判断 元素是否在 df的某一列里
            if number in data_all['型号'].values:

                # 创建一个空字典
                every = {}

                # 遍历当前行的每一列(就是参数列的列名)
                # 当前行已经是Series格式的了,所以是遍历每个索引
                for para in data.index:

                    # 如果参数名已经在总表的列名里了(这个判断必须要有,没有的话,不能获取不存在的列内容)
                    if para in data_all.columns:

                        # 获取老的value
                        old = data_all[data_all['型号'] == data['型号']][para].values

                        # 如果老的value不等于新的value 且 老值和新值都不等于nan
                        if old[0] != data[para] and not(pd.isna(old)) and not(pd.isna(data[para])):
                            # 新值就等于两个老值的合并字符串  注意转化为字符串格式
                            new = str(old[0] +', ' + data[para])
                            print(new)
                        # 否则(老的值=新的值),新值直接就是新值
                        else:
                            new = data[para]
                        # 新值设置好之后,更新列表值 两个办法都可以
                        # every.update({para: new})
                        every[para] = new

                    # 如果之前没有这个参数,就保留新的值
                    else:
                        every.update({para: data[para]})

                # 问题出来了:遇到相同的型号要把老的去掉,但是,旧的数据就直接被删除了
                data_all.drop(data_all[data_all['型号'] == number].index, inplace=True)

                # 可以直接把字典追加到dataframe中不需要转换成df格式
                print(every)
                data_all = data_all.append(every, ignore_index=True)

            # 如果这个型号老的没有,就直接追加到总数据中
            else:
                data_all = data_all.append(data, ignore_index=True)

    data_all.to_excel(end_path, index=False)


# 试试新的办法:把老数据转换成字典,修改字典的办法来组成新数据
def merge2(path,end_path):
    # 获取表格所有的sheet
    xlsx = pd.ExcelFile(path)
    sheets = xlsx.sheet_names

    data_all = pd.DataFrame()
    data_all['型号'] = ''

    # 读取每个表
    for i in range(len(sheets)):
        df = pd.DataFrame(pd.read_excel(path, sheet_name=sheets[i], dtype='str'))

        # 获取每一行的数据
        for j in range(df.shape[0]):
            data = df.iloc[j]
            number = data['型号']

            # 如果当前这行的型号在data_all的型号里面了  (用values是为了获取里面的值,没办法直接判断 元素是否在 df的某一列里
            if number in data_all['型号'].values:

                # 获取旧数据的索引
                index_old = data_all[data_all['型号']==number].index

                # 获取旧数据的内容:生成字典
                every_new = data_all.iloc[index_old].dropna(axis=1).to_dict(orient='records')[0]

                # 获取新数据的每一个key
                for para in data.index:

                    # 获取已有型号的value
                    old = every_new.get(para)

                    # 如果老的value不等于新的value 且 老值(是从字典里读进来的字符串格式)和新值(是nparray格式)的都不等于nan
                    if old != data[para] and (old is not None) and not(pd.isna(data[para])):
                        # 新值就等于两个老值的合并字符串  注意转化为字符串格式
                        new = str(old + ', ' + data[para])
                        # 修改新数据的键值对
                        every_new[para] = new

                    # 否则(老的值=新的值),新值直接就是新值
                    else:
                        new = data[para]
                        every_new[para] = new


                print(every_new)
                data_all.drop(data_all[data_all['型号'] == number].index, inplace=True)

                # 可以直接把字典追加到dataframe中不需要转换成df格式
                print(every_new)
                data_all = data_all.append(every_new, ignore_index=True)

            # 如果这个型号老的没有,就直接追加到总数据中
            else:
                data_all = data_all.append(data, ignore_index=True)

    data_all.to_excel(end_path, index=False)


path = r"C:\Users\86175\Desktop\处理过程.xlsx"
end_path = path.replace("处理过程","合并结果")        # 在原有路径的基础上生成新文件
merge2(path,end_path)

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值