Pandas宽表转长表教程详解
时间:2025-07-29 08:57:32 184浏览 收藏
本文详细介绍了如何使用Python Pandas库中的`lreshape`函数,将包含重复列模式的宽表数据转换为更易于分析的长表数据格式。针对数据分析中常见的宽表结构,如`id_mXX`和`mprice`成对出现的情况,文章深入讲解了`pandas.lreshape`函数的用法,包括如何动态选择列以及应对Pandas自动重命名列的情况。通过清晰的代码示例和步骤解析,本文旨在帮助读者掌握使用`lreshape`函数解决复杂数据重塑问题的技巧,提升数据处理效率,为后续的数据分析和可视化奠定坚实的基础。
问题背景与挑战
在数据分析和处理中,我们经常会遇到一种特殊的宽表数据格式。这种格式的特点是存在多组具有相同逻辑意义但带有不同后缀的列,例如: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非常有利,因为它使得我们可以通过模式匹配来选择所有相关的列。
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)
代码解析:
数据读取与准备:
- 我们使用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能够高效工作的基础。
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列中。
注意事项
- 列名约定: lreshape的强大之处在于它能够处理具有系统性命名模式的列。确保您的原始数据列名具有可识别的模式(例如,所有ID列都以id_m开头,所有价格列都包含price)。
- Pandas自动重命名: 了解Pandas在读取具有重复列名的Excel文件时,会自动添加数字后缀(如mprice.1)的行为至关重要。这使得filter(like=...)方法能够优雅地捕获所有相关列。
- 数据类型: 在重塑数据后,请检查新生成的列(如mprice)的数据类型是否正确。如果原始数据中的数字是文本格式(例如,使用逗号作为小数分隔符),您可能需要在读取数据时使用decimal=','参数,或者在重塑后进行类型转换。
- 固定列: 对于像Date这样不需要重塑但需要保留的列,lreshape会自动将其作为固定列保留,并在重塑后的数据中重复显示。
总结
pandas.lreshape是处理具有重复列组的宽表数据并将其转换为长格式的强大工具。与melt相比,它在处理这种特定模式时提供了更直接和简洁的语法。通过灵活运用mapping参数和df.filter()等动态列选择方法,您可以高效地完成复杂的数据重塑任务,为后续的数据分析和可视化奠定坚实的基础。掌握lreshape将显著提升您在Python中处理复杂表格数据的能力。
本篇关于《Pandas宽表转长表教程详解》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
194 收藏
-
323 收藏
-
204 收藏
-
318 收藏
-
316 收藏
-
339 收藏
-
139 收藏
-
244 收藏
-
217 收藏
-
100 收藏
-
123 收藏
-
300 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习