python实现多个excel匹配到一个表格2.0

python实现多个excel匹配到一个表格(论文实证部分)2.0

数据处理大致流程

  1. 国泰安找数据下载
  2. 数据清洗 (删除无效数据,是每个从国泰安下载的数据变成第一列是股票代码,第二列是年份 (易报错点) ,第三列是解释变量,年份格式一般最后就-年-而不是年-月-日这样的格式)
  3. 被解释变量的excel表也需要第一列是股票代码,第二列是年份,后面几列就无所谓了。将解释变量都放在一个文件夹里,并且为excel文件重命名附上数字(易报错点) ,因为程序匹配解释变量是按照文件名的数字去按顺序匹配的。被解释变量的excel表是不需要放在文件夹里的

代码核心逻辑

将被解释变量的excel表赋值给表1,将需要被匹配到同一张表格的放在同一文件夹的多个解释变量赋值给表2,通过for循环匹配到同一张表格

图示逻辑

全过程图示逻辑

请添加图片描述

解释变量处理的图示逻辑

在这里插入图片描述

国泰安重复数据归因

  1. 报表类型,一般取报表类型A
  2. 季度数据,一般分析年度数据,需要转换
  3. 我记得还有一个,忘记了

检验思路

原本老师是让用excel的lookup命令把所有的解释变量匹配到一张表的如下:

=LOOKUP(1,0/(Sheet2!$A 4 : 4: 4:AKaTeX parse error: Expected 'EOF', got '&' at position 6: 28746&̲Sheet2!B 4 : 4: 4:BKaTeX parse error: Expected 'EOF', got '&' at position 16: 28746=Sheet1!A3&̲Sheet1!C3),Shee…H 4 : 4: 4:H$​28746)

但解释变量少还好,多了就麻烦了,感觉国泰安集成一个这么个匹配功能应该也不麻烦吧。所以我的检验方法是用excel的lookup命令匹配一遍,程序匹配一遍,二者结果无误,所以该代码可以执行我想要的匹配功能

代码展示

# 功能命名:More date in one;
# 功能描述:把表2匹配到表1
# 作者:yby
# 版本:2.0 第二阶段增加了类似lookup多条件匹配功能 2024/4/14
# 版本:3.0 修改了直接用merge函数多条件匹配,去掉了contact函数,修正了因对表2的第一列格式修改导致表1前面n行匹配不上的问题 2024/4/15
# 版本 4.0 增加了tkinter 窗口,检测合并表格导致的非正常数据;增加了st筛选功能 2024/4/17
# 4.1 增加通过tkinter来选择文件,无须复制文件地址 2024/4/18 18:00
# 4.1.1 增加了打印重复项,更好地排查错误 2024/4/18 22:00
# 4.1.2 通过将列名保存为变量,提高代码的可维护性和复用性;增加了修改文件名功能;增加日期转换双方案; 2024/4/19 20:00
# 5.0 此次更新支持将多个excel表匹配到目标表格,提高了匹配速度;修复了匹配时行数增加的问题(但仍不知问题所在,不过行数固定下来了);批量封装代码,提高可维护性;2024/4/22 1:06
# 5.1 修改remove_st_companies函数使判断窗口更简洁以及统一  2024/4/25 0:38
# 5.2 让存放表2的文件夹按照文件名里所含数字顺序去匹配表1,得重命名表2加上数字,不然报错2024/4/26 23:00
# 5.3 将在匹配过程里删除st公司,删除重复值,以及重复值检验的功能迁移到循环外,减少手动处理的过程;添加补0功能和删除含空值所在行 2024/5/7 1:24
# 5.4 每次都把表2的表头统一修改一下,匹配时只需保留三列 2024/5/8 20:58
# 5.4.1 增加合并后每列会显示多少空值,以及删除后得有效数据行数 2024/5/15 13:46

import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import pandas as pd
import os

def remove_st_companies(data_frame):
    mask = data_frame.astype(str).apply(lambda x: x.str.contains('ST|st', case=False)).any(axis=1)    # 创建一个掩码,用于标识整个数据帧中哪些行包含 "ST" 或 "st"
    print(mask)
    if mask.any():
        print("表2含有st或ST,删除包含st或ST的公司所在行。")

        root = tk.Tk()          # 使用Tkinter对话框获取用户输入
        root.withdraw()  # 隐藏Tkinter主窗口

        choice = tk.messagebox.askyesno("确认删除", "表2含有st或ST,是否执行删除st或ST代码?")  # 弹出消息框,询问用户是否继续

        if choice:
            data_frame = data_frame[~mask]              # 删除包含 "ST" 或 "st" 的行
            print('含st,已删除st公司')
        else:
            print("不执行该程序")
    else:
        print('已核实无st公司')
    return data_frame

def remove_nan_rows(data_frame):   # 删除空白值所在行
    if data_frame.isnull().values.any():
        print("存在空值行,删除空值行。")

        root 
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值