0

0

Python Pandas:高效重构宽表数据为长表格式的实用指南

聖光之護

聖光之護

发布时间:2025-07-08 19:24:20

|

546人浏览过

|

来源于php中文网

原创

Python Pandas:高效重构宽表数据为长表格式的实用指南

本教程旨在详细阐述如何利用Pandas库高效地将具有重复列模式(如id_mXX和mprice成对出现)的宽格式Excel数据重构为更易于分析的长格式数据。文章将重点讲解pandas.lreshape函数的使用方法,包括动态列选择和处理Pandas自动重命名列的场景,旨在提供清晰、专业的教程,帮助用户解决复杂的数据重塑问题。

问题背景与挑战

在数据分析和处理中,我们经常会遇到一种特殊的宽表数据格式。这种格式的特点是存在多组具有相同逻辑意义但带有不同后缀的列,例如:id_m00和mprice构成一组,id_m01和mprice构成另一组,依此类推。一个典型的示例如下:

Date id_m00 mprice id_m01 mprice
01.01.2023 aa-bb-cc 12,05 dd-ee-fr 8,80
02.01.2023 aa-dd-ee 09,55 ff-gg-gg 7,50

这种结构在数据录入时可能很方便,但在进行聚合分析或绘制图表时却非常不便。我们通常希望将其转换为更标准化的“长格式”数据,即每行代表一个独立的观测值,所有相同类型的数据都归入一列。期望的目标格式如下:

Date id mprice
01.01.2023 aa-bb-cc 12,05
02.01.2023 aa-dd-ee 09,55
01.01.2023 dd-ee-fr 8,80
02.01.2023 ff-gg-gg 7,50

对于这种数据重塑任务,Pandas库提供了多种函数,如melt。然而,当列名模式复杂且存在重复列名时,melt函数可能无法直接达到预期效果,可能导致额外的空值列或需要复杂的后处理。在这种情况下,pandas.lreshape函数提供了一个更为优雅和直接的解决方案。

pandas.lreshape:解决方案的核心

pandas.lreshape函数专为处理具有重复列组(或称“模式化列”)的宽表数据而设计。它允许你指定如何将这些重复的列组“堆叠”起来,形成新的长格式列。其核心在于通过一个映射字典来定义哪些原始列应该合并成新的目标列。

实现步骤与代码解析

首先,我们需要模拟从Excel读取数据并创建DataFrame。值得注意的是,当Pandas读取Excel文件时,如果存在同名的列(例如多个mprice列),它会自动为重复的列名添加数字后缀,如mprice.1、mprice.2等。这种自动重命名对于我们使用lreshape非常有利,因为它使得我们可以通过模式匹配来选择所有相关的列。

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

QIMI奇觅
QIMI奇觅

美图推出的游戏行业广告AI制作与投放一体化平台

下载
import pandas as pd
import io

# 模拟从Excel读取的数据
# 假设Pandas在读取时将重复的'mprice'列自动重命名为'mprice', 'mprice.1'等
# 在实际应用中,您将使用 pd.read_excel("your_file.xlsx")
data = """Date,id_m00,mprice,id_m01,mprice.1
01.01.2023,aa-bb-cc,12,05,dd-ee-fr,8,80
02.01.2023,aa-dd-ee,09,55,ff-gg-gg,7,50
"""
# 使用io.StringIO模拟文件读取,并处理欧洲数值格式(逗号作小数分隔符)
# 注意:原始数据中12,05和09,55在csv中会被解析为两列,这里为了模拟,将逗号替换为点
# 实际Excel读取时,如果Pandas能正确识别区域设置,可能不需要手动替换
# 为了简化模拟,我们假设数据是12.05,8.80
data_corrected = """Date,id_m00,mprice,id_m01,mprice.1
01.01.2023,aa-bb-cc,12.05,dd-ee-fr,8.80
02.01.2023,aa-dd-ee,9.55,ff-gg-gg,7.50
"""
df = pd.read_csv(io.StringIO(data_corrected), sep=',')

# 将Date列转换为日期时间格式
df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%Y')

print("原始 DataFrame 结构:")
print(df)
print("\n")

# 使用lreshape重构数据
# mapping参数是一个字典,键是新的目标列名,值是包含原始列名的列表
# df.filter(like="...") 可以动态地选择所有匹配模式的列
out = pd.lreshape(
    df,
    {"id": df.filter(like="id_m").columns, # 匹配所有以"id_m"开头的列,合并为新的"id"列
     "mprice": df.filter(like="price").columns} # 匹配所有包含"price"的列(包括mprice, mprice.1等),合并为新的"mprice"列
)

print("重构后的 DataFrame:")
print(out)

代码解析:

  1. 数据读取与准备:

    • 我们使用pd.read_csv(io.StringIO(data_corrected), sep=',')来模拟从CSV(或Excel)文件读取数据。在实际应用中,您会直接使用pd.read_excel("your_file.xlsx")。
    • df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%Y') 将日期字符串转换为Pandas的日期时间对象,方便后续处理。
    • 关键点: 当Pandas读取Excel文件时,如果原始数据中有多个名为mprice的列,它会自动将它们重命名为mprice, mprice.1, mprice.2等。这个特性是lreshape能够高效工作的基础。
  2. pd.lreshape函数:

    • df: 这是我们要重塑的DataFrame。
    • mapping: 这是一个字典,定义了如何将宽格式的列映射到长格式的新列。
      • 键 ("id", "mprice") 是我们希望在输出DataFrame中拥有的新列的名称。
      • 值 (df.filter(like="id_m").columns, df.filter(like="price").columns) 是一个包含原始DataFrame中所有相关列名的列表。
        • df.filter(like="id_m").columns: 这是一个非常实用的Pandas功能,它会返回DataFrame中所有列名中包含“id_m”字符串的列。这确保了无论是id_m00、id_m01还是id_m46,都会被自动选中并归入新的id列。
        • df.filter(like="price").columns: 同理,这会选择所有列名中包含“price”字符串的列,包括原始的mprice以及Pandas自动重命名后的mprice.1、mprice.2等,并将它们合并到新的mprice列中。

注意事项

  1. 列名约定: lreshape的强大之处在于它能够处理具有系统性命名模式的列。确保您的原始数据列名具有可识别的模式(例如,所有ID列都以id_m开头,所有价格列都包含price)。
  2. Pandas自动重命名: 了解Pandas在读取具有重复列名的Excel文件时,会自动添加数字后缀(如mprice.1)的行为至关重要。这使得filter(like=...)方法能够优雅地捕获所有相关列。
  3. 数据类型: 在重塑数据后,请检查新生成的列(如mprice)的数据类型是否正确。如果原始数据中的数字是文本格式(例如,使用逗号作为小数分隔符),您可能需要在读取数据时使用decimal=','参数,或者在重塑后进行类型转换。
  4. 固定列: 对于像Date这样不需要重塑但需要保留的列,lreshape会自动将其作为固定列保留,并在重塑后的数据中重复显示。

总结

pandas.lreshape是处理具有重复列组的宽表数据并将其转换为长格式的强大工具。与melt相比,它在处理这种特定模式时提供了更直接和简洁的语法。通过灵活运用mapping参数和df.filter()等动态列选择方法,您可以高效地完成复杂的数据重塑任务,为后续的数据分析和可视化奠定坚实的基础。掌握lreshape将显著提升您在Python中处理复杂表格数据的能力。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

71

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

1

2026.01.31

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

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

310

2023.10.31

php数据类型
php数据类型

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

222

2025.10.31

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

824

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

436

2024.06.27

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

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

320

2023.08.03

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

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

212

2023.09.04

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

8

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

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

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