You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel数据处理:跳过空行并修复列长度不匹配问题

处理Excel多行拆分:空值与列长度不匹配解决方案

原始数据集

Col 1Col 2Col 3Col 4Col 5Col 6Col 7Col 8
12A\n \nBC\n \nDE\n \nFG\n \nHI\n \nJK\n \nL
34
56a\n \nbce\n \nfg\n \nhi\n \njk\n \nl

需求说明

  • 以Col3按\n \n拆分后的结果数量,确定每行需要生成的新行数量
  • Col1、Col2在所有新行中重复原行值
  • 直接删除Col3为空的行
  • 若Col3-Col8中某列拆分后的长度与Col3不一致,该列在所有新行中重复对应值(如示例中Col4的c会在两行都显示)

目标数据集

Col 1Col 2Col 3Col 4Col 5Col 6Col 7Col 8
12ACEGIK
12BDFHJL
56acegik
56bcfhjl

现有代码问题

原代码仅能处理Col3有值且所有列拆分后长度一致的情况,无法正确处理Col3空值行,也不能解决列拆分长度不匹配的填充问题。


修改后的完整代码

import pandas as pd

def PrintConsole(content):
    print(content)
    print("-"*50)

def ExitCode():
    pass

def splitappendix(moduleName):
    tableHeaders = ["A", "B", "C", "D", "E", "F", "G", "H"]
    splitfunctionHeaders = ["Col 1", "Col 2", "Col 3", "Col 4", "Col 5", "Col 6", "Col 7", "Col 8"]

    df = pd.read_excel(f'Output\\{moduleName}')
    df.columns = splitfunctionHeaders

    PrintConsole("原始数据:")
    PrintConsole(df)

    # 一次性删除Col3为空的行并重置索引
    df = df.dropna(axis=0, subset=['Col 3']).reset_index(drop=True)
    PrintConsole("删除Col3空值后的数据:")
    PrintConsole(df)

    df_rep = pd.DataFrame(columns=splitfunctionHeaders)

    for idx, row in df.iterrows():
        # 按Col3拆分结果确定新行数量
        col3_split = row['Col 3'].split('\n \n')
        row_count = len(col3_split)

        # 生成重复的Col1、Col2值
        single_rep = pd.DataFrame({
            'Col 1': [row['Col 1']] * row_count,
            'Col 2': [row['Col 2']] * row_count
        })

        # 逐个处理Col3至Col8的拆分与填充
        for col in splitfunctionHeaders[2:]:
            col_value = row[col]
            if pd.isna(col_value):
                # 空值列填充空字符串
                single_rep[col] = [''] * row_count
            else:
                col_split = col_value.split('\n \n')
                # 若拆分后长度不足,重复最后一个值补足
                if len(col_split) < row_count:
                    col_split += [col_split[-1]] * (row_count - len(col_split))
                # 取前row_count个值,避免拆分过长的情况
                single_rep[col] = col_split[:row_count]

        df_rep = pd.concat([df_rep, single_rep], ignore_index=True)

    PrintConsole("最终处理结果:")
    PrintConsole(df_rep)

    # 重命名列并保存到Excel
    df_rep.columns = tableHeaders
    df_rep.to_excel(f'Output\\{moduleName}', index=False)

if __name__ == "__main__":
    moduleName = 'Appendix.xlsx'
    splitappendix(moduleName)
    PrintConsole("Split Complete")
    ExitCode()

关键优化点

  1. 高效删除空值行:直接使用df.dropna批量删除Col3为空的行,避免循环中修改DataFrame导致的索引混乱
  2. 统一列处理逻辑:对Col3-Col8每一列单独拆分,自动判断长度是否匹配,不足时用最后一个值填充,空值则填充空字符串
  3. 简化重复值生成:用列表乘法快速生成Col1、Col2的重复值,比循环赋值更高效
  4. 避免索引错误:删除空值后重置索引,确保循环遍历的索引连续无断层

内容的提问来源于stack exchange,提问作者Colton needs help

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:39:59