0

0

利用Python Pandas处理Excel非标准格式数据:跨行单元格合并技巧

心靈之曲

心靈之曲

发布时间:2025-11-14 12:59:01

|

1008人浏览过

|

来源于php中文网

原创

利用Python Pandas处理Excel非标准格式数据:跨行单元格合并技巧

本文详细介绍了如何使用python pandas库自动化处理excel电子表格中的非标准数据格式,特别是针对那些数据内容跨越多个连续行但逻辑上属于同一单元格的情况。通过迭代处理行对并有条件地合并指定列的数据,将原本分散在两行中的信息整合成单个单元格内的列表,从而将非标准格式的数据转换为规范的表格结构,便于后续分析和处理。

数据格式化挑战

在日常数据处理中,我们经常会遇到从各种系统导出的Excel文件,其数据格式可能并非标准的二维表格。例如,某些数据项为了排版或历史原因,会跨越两行甚至多行显示,但从逻辑上讲,它们应该属于同一条记录的同一列。

以一个常见的场景为例:原始Excel数据中,Data B1 和 Data D1 的信息分别占据了连续的两行。如果直接将这样的数据导入到表格中,会导致数据错位,形成如下两行不完整的记录:

1:[Data A1, Data B1(第一行), Data C1, Data D1(第一行), Data E1],
2:[' ', Data B1(第二行), ' ', Data D1(第二行), ' ']

然而,我们期望的理想格式是将属于同一逻辑单元格的数据合并到一行中,例如:

1:[Data A1, [Data B1(第一行), Data B1(第二行)], Data C1, [Data D1(第一行), Data D1(第二行)], Data E1]

这种格式化需求对于后续的数据分析、数据库导入或报表生成至关重要。手动处理耗时且易出错,因此需要一个自动化的解决方案。

立即学习Python免费学习笔记(深入)”;

XPaper Ai
XPaper Ai

AI撰写论文、开题报告生成、AI论文生成器尽在XPaper Ai论文写作辅助指导平台

下载

Pandas解决方案概述

Python的Pandas库是处理表格数据(DataFrame)的强大工具。针对上述跨行单元格合并的问题,我们可以设计一个策略:

  1. 逐对读取行: 遍历DataFrame,每次读取两行数据。
  2. 识别目标列: 确定需要合并内容的列(例如,示例中的 'Data B1' 和 'Data D1' 对应的列)。
  3. 条件合并: 对于目标列,将两行中的数据合并成一个列表;对于其他列,则取第一行的数据。
  4. 构建新DataFrame: 将处理后的新行添加到结果DataFrame中。

代码实现与解析

以下是使用Pandas实现上述数据转换的完整代码:

import pandas as pd

# 假设Excel文件名为 'data.xlsx',数据位于 'Sheet1'
excel_file = 'data.xlsx'
sheet_name = 'Sheet1'

# 1. 读取Excel文件到Pandas DataFrame
try:
    df = pd.read_excel(excel_file, sheet_name=sheet_name)
except FileNotFoundError:
    print(f"错误:文件 '{excel_file}' 未找到。请确保文件存在且路径正确。")
    exit()
except Exception as e:
    print(f"读取Excel文件时发生错误:{e}")
    exit()

# 2. 初始化一个空的DataFrame,用于存储格式化后的数据
# 确保新DataFrame的列与原始DataFrame一致
formatted_df = pd.DataFrame(columns=df.columns)

# 3. 遍历原始DataFrame,每次处理两行
# range(0, len(df), 2) 表示从索引0开始,步长为2,确保每次处理一对行
for i in range(0, len(df), 2):
    # 获取当前行 (第一行)
    row1 = df.iloc[i]

    # 安全地获取下一行 (第二行)
    # 如果当前是最后一行且总行数为奇数,则第二行为None
    row2 = df.iloc[i + 1] if i + 1 < len(df) else None

    # 4. 构建合并后的新行
    combined_row = {}
    for col in df.columns:
        # 确定需要合并的列名。请根据实际Excel文件的列标题进行修改。
        # 例如,如果你的列名是 'B列数据' 和 'D列数据',则修改为 ['B列数据', 'D列数据']
        if col in ['Data B1', 'Data D1']:  
            # 将两行对应列的数据合并成一个列表
            # 如果row2不存在(即原始数据行数为奇数),则第二部分为None
            combined_row[col] = [row1[col], row2[col] if row2 is not None else None]
        else:
            # 对于不需要合并的列,直接取第一行的数据
            combined_row[col] = row1[col]

    # 5. 将合并后的行添加到结果DataFrame
    # 使用 pd.concat 代替 df.append 以提高性能(对于大型数据集更明显)
    # 但此处为保持与原始答案逻辑一致性,仍使用append,但建议在实际项目中考虑concat
    formatted_df = pd.concat([formatted_df, pd.DataFrame([combined_row])], ignore_index=True)

# 6. 将格式化后的DataFrame保存到新的Excel文件
output_file = 'formatted_output.xlsx'
try:
    formatted_df.to_excel(output_file, index=False)
    print(f"数据已成功格式化并保存到 '{output_file}'")
except Exception as e:
    print(f"保存Excel文件时发生错误:{e}")

代码解析:

  1. 文件读取与错误处理: pd.read_excel() 用于加载Excel文件。添加了 try-except 块来处理文件未找到或其他读取错误,提高脚本的健壮性。
  2. formatted_df 初始化: 创建一个空的DataFrame formatted_df,它的列名与原始DataFrame df 保持一致,确保最终输出的结构正确。
  3. for 循环与 range(0, len(df), 2): 这是核心的遍历逻辑。range(start, stop, step) 函数以步长 2 迭代,确保每次循环 i 都是一对行的起始索引。
  4. df.iloc[i]: iloc 是Pandas中基于整数位置进行索引的方法。df.iloc[i] 获取索引为 i 的行,即当前对的第一行。
  5. 安全获取 row2: row2 = df.iloc[i + 1] if i + 1
  6. 条件合并逻辑:
    • if col in ['Data B1', 'Data D1']: 这里是指定需要合并的列。请务必将 'Data B1' 和 'Data D1' 替换为你的Excel文件中实际的列标题
    • combined_row[col] = [row1[col], row2[col] if row2 is not None else None]: 对于指定的列,它将 row1 和 row2 中对应列的数据打包成一个Python列表。如果 row2 为 None,则列表的第二个元素也将是 None。
    • else: combined_row[col] = row1[col]: 对于其他不需要合并的列,直接取 row1 中的数据。
  7. pd.concat() 添加行: pd.concat([formatted_df, pd.DataFrame([combined_row])], ignore_index=True) 将新生成的 combined_row 转换为一个单行DataFrame,并与 formatted_df 进行拼接。虽然原始答案使用了 append,但 pd.concat 在处理大量数据时通常更高效,因为它避免了反复创建新的DataFrame对象。ignore_index=True 确保新DataFrame的索引是连续的。
  8. 保存结果: formatted_df.to_excel(output_file, index=False) 将处理后的DataFrame保存到一个新的Excel文件。index=False 避免将DataFrame的索引写入Excel文件。

关键点与注意事项

  • 列名匹配: 代码中的 ['Data B1', 'Data D1'] 必须与你的Excel文件中的实际列标题完全匹配。如果列名有变化,请相应修改代码。
  • 数据结构假设: 本教程假设数据是两行一组进行合并的。如果你的数据是三行一组或更复杂的模式,你需要调整 range() 的步长和 row 的获取逻辑。
  • 奇数行处理: 提供的解决方案能够优雅地处理原始数据行数为奇数的情况。在这种情况下,最后一对的第二行将被视为 None,合并后的列表中对应的元素也将是 None。你可以根据实际需求,选择如何处理这些 None 值(例如,在保存前进行清理或填充)。
  • 性能优化: 对于非常大的Excel文件(数十万行以上),频繁地使用 pd.concat 可能会影响性能。更优的策略是先将所有 combined_row 收集到一个列表中,然后在循环结束后一次性通过 pd.DataFrame(list_of_combined_rows) 创建最终的DataFrame。
  • 数据类型: 合并后的单元格内容会变成Python列表。如果后续需要进一步处理这些列表(例如,提取特定元素或将其转换为字符串),请注意数据类型的变化。

总结

通过Python Pandas,我们可以高效地自动化处理Excel电子表格中的非标准数据格式。本文介绍的方法通过迭代行对和有条件地合并指定列的数据,成功地将跨行显示的逻辑单元格内容整合到单个单元格的列表中,从而将半结构化数据转换为标准的表格格式。掌握这一技巧,将大大提高数据清洗和预处理的效率,为后续的数据分析工作打下坚实基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

62

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

309

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

778

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 14.2万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号