
在数据分析和处理中,我们经常会遇到一种特殊的宽表数据格式。这种格式的特点是存在多组具有相同逻辑意义但带有不同后缀的列,例如: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函数专为处理具有重复列组(或称“模式化列”)的宽表数据而设计。它允许你指定如何将这些重复的列组“堆叠”起来,形成新的长格式列。其核心在于通过一个映射字典来定义哪些原始列应该合并成新的目标列。
首先,我们需要模拟从Excel读取数据并创建DataFrame。值得注意的是,当Pandas读取Excel文件时,如果存在同名的列(例如多个mprice列),它会自动为重复的列名添加数字后缀,如mprice.1、mprice.2等。这种自动重命名对于我们使用lreshape非常有利,因为它使得我们可以通过模式匹配来选择所有相关的列。
立即学习“Python免费学习笔记(深入)”;
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.lreshape函数:
pandas.lreshape是处理具有重复列组的宽表数据并将其转换为长格式的强大工具。与melt相比,它在处理这种特定模式时提供了更直接和简洁的语法。通过灵活运用mapping参数和df.filter()等动态列选择方法,您可以高效地完成复杂的数据重塑任务,为后续的数据分析和可视化奠定坚实的基础。掌握lreshape将显著提升您在Python中处理复杂表格数据的能力。
以上就是Python Pandas:高效重构宽表数据为长表格式的实用指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号