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)
合并不同表格的数据,保留重复对应格的数据
于 2024-02-06 18:04:52 首次发布