首发于 python学习
【Python技巧分享】pandas处理Excel表格多级表头并导入MySQL

【Python技巧分享】pandas处理Excel表格多级表头并导入MySQL

工作中遇到很多有多级表头(多级标题行)的表格,类似以下这种多级表头(实际工作中的表格有几百列),但是初学编程不知道怎么处理好,在网上也基本找不到相关案例,比较多看到的是自行命名,但这种只适合字段列很少的情况。

后来只能自己研究,现将实现方案分享如下,欢迎讨论共同提升。

    def excel_to_sql_multistage_header_file(excel_filepath, excel_sheet_name, sql_table_name, header_first_line, header_last_line, delete_line_num):
        """用于将多级表头(这里仅适用于二级表头)导入表格到SQL中-林子"""
        # 首先读取Excel表格,填入路径或SHEET名,索引列和标题行均设置为无
        df = pd.read_excel(excel_filepath, sheet_name=excel_sheet_name, index_col=None, header=None)
        # 接下来读取多级表头,并将表头先转换成列表
        row_1 = df.iloc[header_first_line-1, :]  # 读取多级表头的第一行
        row_1_list = row_1.tolist()  # 把多级表头的第一行转换成列表
        row_2 = df.iloc[header_last_line-1, :]  # 读取多级表头的第二行
        row_2_list = row_2.tolist() # 把多级表头的第二行转换成列表
        # 然后就是判断多级表头的第一行是否有合并单元格,如果有的话则用合并单元格的值填充到合并的每一列,
        for i in range(len(row_1_list)):
            if type(row_1_list[i]) == float:  # 采用FLOAT识别是否为空,在pandas中空值NaN的字符型为浮点数
                row_1_list[i] = row_1_list[i - 1]  # 实现如果这一行存在空的话,就向右填充
            else:
                pass  # 如果没有合并单元格就无需处理
        new_title = []  # 建立一个新的标题行空列表
        # 以下就是将读取的多级表头两列列表进行合并为一个列表
        for i in range(len(row_1_list)):
            str1 = str(row_1_list[i])  
            str1 = str1.strip()  # 去掉空格和过行符
            str2 = str(row_2_list[i])
            str2 = str2.strip()
            new_str = [str1, str2]
            if str2 == 'nan':
                new_title.append(str1)  # 标题一二行合并的单元格就会出现第二行的值为空的情况
            else:
                new_title.append(''.join(new_str))
        # 将合并后的列表设置为dataframe的标题
        df.columns = new_title
        # 原有的多级标题行删除
        df.drop(df.head(delete_line_num).index, inplace=True)
        # 标题处理完后就可以导入mysql数据库了
        df = df.where(df.notnull(), None)  # 将NAN替换为NONE
        print("创建多级表头成功")