python-pandas库实现Excel多行内容合并为一行

实现

import openpyxl
import os
import pandas as pd

# import numpy as np

"""
将一个excel工作表根据条件拆分为多个工作表
"""


def split_excel():
    # str = object保留excel表数据原格式,防止保存excel时数值以科学计数格式保存造成信息丢失
    df = pd.DataFrame(pd.read_excel('../Excel_Set/岩屑描述数据导入模板.xlsx', sheet_name='台账导入模板', dtype=object))
    # print('done')
    writer = pd.ExcelWriter('../Excel_Ouput/岩屑描述数据导入模板.xlsx')

    # 在原工作簿基础上新增工作表
    wb = openpyxl.load_workbook('../Excel_Ouput/岩屑描述数据导入模板.xlsx')
    writer.book = wb

    # 缺失值填充为'无井号'
    df['井号'] = df['井号'].fillna('无井号')

    for groupname, groupdf in df.groupby('井号'):
        if groupname == '无井号':
            # 将填充为'无井号'的值再改为缺失值
            groupdf['井号'] = None
            groupdf.to_excel(writer, sheet_name=groupname, index=False)
        else:
            groupdf.to_excel(writer, sheet_name=groupname, index=False)

    writer.save()
    writer.close()
    wb.close()
    print('Done!')


def concat_func(row):
    return pd.Series({
        '单位': ''.join(row['单位'].unique()),
        '井号': ''.join(row['井号'].unique()),
        '顶界深度(m)': ''.join('%s' % a for a in row['顶界深度(m)'].unique()),
        '底界深度(m)': ''.join('%s' % a for a in row['底界深度(m)'].unique()),
        '定名岩屑占岩屑量(%)': ''.join('%s' % a for a in row['定名岩屑占岩屑量(%)'].unique()),
        '含油岩屑占定名岩屑量(%)': ''.join('%s' % a for a in row['含油岩屑占定名岩屑量(%)'].unique()),
        '含油岩屑占岩屑量(%)': ''.join('%s' % a for a in row['含油岩屑占岩屑量(%)'].unique()),
        '含油岩屑占同类岩屑含量(%)': ''.join('%s' % a for a in row['含油岩屑占同类岩屑含量(%)'].unique()),
        '颜色代码': ''.join('%s' % a for a in row['颜色代码'].unique()),
        '颜色': ''.join('%s' % a for a in row['颜色'].unique()),
        '岩石粒级': ''.join('%s' % a for a in row['岩石粒级'].unique()),
        '含油级别代码': ''.join('%s' % a for a in row['含油级别代码'].unique()),
        '含油级别': ''.join('%s' % a for a in row['含油级别'].unique()),
        '岩石名称代码': ''.join('%s' % a for a in row['岩石名称代码'].unique()),
        '岩石名称': ''.join('%s' % a for a in row['岩石名称'].unique()),
        '复查结果': ''.join('%s' % a for a in row['复查结果'].unique()),
        '滴照荧光级别': ''.join('%s' % a for a in row['滴照荧光级别'].unique()),
        '荧光滴照颜色': ''.join('%s' % a for a in row['荧光滴照颜色'].unique()),
        '荧光干照颜色': ''.join('%s' % a for a in row['荧光干照颜色'].unique()),
        '荧光湿照颜色': ''.join('%s' % a for a in row['荧光湿照颜色'].unique()),
        '滴水试验': ''.join('%s' % a for a in row['滴水试验'].unique()),
        '综合描述': ''.join(row['综合描述'].unique()),
        '描述人': ''.join('%s' % a for a in row['描述人'].unique()),
        '录入人': ''.join('%s' % a for a in row['录入人'].unique()),
        '审核人': ''.join('%s' % a for a in row['审核人'].unique()),
        '复审人': ''.join('%s' % a for a in row['复审人'].unique()),
        '录入单位': ''.join(row['录入单位'].unique()),
        '录入时间': ''.join('%s' % a for a in row['录入时间'].unique()),
        '入库日期': ''.join('%s' % a for a in row['入库日期'].unique()),
        '备注': ''.join('%s' % a for a in row['备注'].unique())
    })


def course_excel(path):
    try:
        # 读取excel
        df1 = pd.read_excel(path, dtype={'顶界深度(m)': str, '底界深度(m)': str})
    except FileNotFoundError:
        print('\033[31mERROR:运行失败,文件名或目录错误,修改后重试!!!\033[0m')
    else:
        # 某列空单元格填充上一行值
        df1['编号'] = df1['编号'].fillna(method='pad', axis=0)
        # 将NaN替换为空值
        d = pd.DataFrame(data=df1)
        df1 = d.fillna(value='')
        try:
            # 根据某字段分组,将同组单元格内容合并
            result = df1.groupby(df1['编号']).apply(lambda row: concat_func(row)).reset_index()
        except KeyError as e:
            print('\033[31mERROR:表格字段缺失或者错误,修改excel后重试:\033[0m', e)
        else:
            # 将nan替换为None,非nan不替换。前面已经做了处理,不需要再处理
            # result = result.where((result.applymap(lambda x: True if str(x) != 'nan' else False)), None)

            order = ['单位', '井号', '编号', '顶界深度(m)', '底界深度(m)', '定名岩屑占岩屑量(%)',
                     '含油岩屑占定名岩屑量(%)',
                     '含油岩屑占岩屑量(%)', '含油岩屑占同类岩屑含量(%)', '颜色代码', '颜色', '岩石粒级', '含油级别代码',
                     '含油级别',
                     '岩石名称代码', '岩石名称', '复查结果', '滴照荧光级别', '荧光滴照颜色', '荧光干照颜色',
                     '荧光湿照颜色',
                     '滴水试验', '综合描述', '描述人', '录入人', '审核人', '复审人', '录入单位', '录入时间', '入库日期',
                     '备注'
                     ]
            # 重新定义列字段名称及顺序
            result['编号'] = result['编号'].astype(int)
            result = result[order]
            # 定义输出excel名称
            well_number = result['井号'].at[0]
            # 输出excel
            result.to_excel(fr'../lj_output/{well_number}岩屑描述数据.xlsx', index=False)
            # 完成打印
            print(f'{well_number}\tDone!')


def get_all_excel(path):
    for file_name in os.listdir(path):
        if file_name.endswith('.xlsx') or file_name.endswith('.xls'):
            # 构建文件路径
            file_path = os.path.join(path, file_name)
            print(f'开始处理{file_name}文件')
            course_excel(file_path)
        else:
            print('文件夹内存在非xls、xlsx文件,删除该文件后重试')
            break
    print('='*10+'当前表格处理完成'+'='*10)

if __name__ == '__main__':
    # course_excel('../Excel_Set/温21-2.xls')
    get_all_excel('../Excel_Set/')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容