新闻中心

Pandas DataFrame多列重塑:将宽格式数据转换为长格式的实用技巧

2025-11-19
浏览次数:
返回列表

Pandas DataFrame多列重塑:将宽格式数据转换为长格式的实用技巧

本文探讨了在pandas dataframe中将多列宽格式数据重塑为长格式的多种方法。通过示例,详细介绍了使用pandas原生函数如`melt`与`pivot`、基于multiindex的高级重塑技巧,以及利用`pyjanitor`库中`pivot_longer`函数的便捷操作。旨在帮助用户高效地规整数据,使其更适合分析和可视化。

在数据分析和处理中,我们经常会遇到需要将DataFrame中的“宽格式”数据转换为“长格式”数据的情况。宽格式数据通常表现为,多个相关联的指标被分散在不同的列中,且列名中包含了这些指标的分类信息。例如,原始数据中可能包含 right_count, right_sum, left_count, left_sum 等列,我们希望将其重塑为 side, count, sum 三列,其中 side 列表示“right”或“left”,count 和 sum 列分别包含对应的值。这种转换对于后续的数据聚合、可视化和建模至关重要。

以下是一个典型的宽格式DataFrame示例:

import pandas as pd

df = pd.DataFrame({
    'date': ['2025-12-01', '2025-12-05', '2025-12-07'],
    'other_col': ['a', 'b', 'c'],
    'right_count': [4, 7, 9],
    'right_sum': [2, 3, 5],
    'left_count': [1, 8, 5],
    'left_sum': [0, 8, 4]
})

print("原始DataFrame:")
print(df)

期望的输出格式如下:

         date other_col   side  count  sum
0  2025-12-01         a  right      4    2
1  2025-12-05         b  right      7    3
2  2025-12-07         c  right      9    5
3  2025-12-01         a   left      1    0
4  2025-12-05         b   left      8    8
5  2025-12-07         c   left      5    4

接下来,我们将介绍几种实现这种数据重塑的有效方法。

方法一:使用 melt 和 pivot 进行数据重塑

pandas.melt 函数用于将DataFrame从宽格式转换为长格式,它会将指定的列“融化”成两列:一列包含原列名(通常命名为variable),另一列包含对应的值(通常命名为value)。之后,我们可以利用 str.split 分割 variable 列,并结合 pivot 函数将数据重新排列成我们需要的长格式。

# 步骤1: 使用 melt 函数将 'right_count', 'right_sum', 'left_count', 'left_sum' 列融化
# id_vars 指定不变的标识列
tmp = df.melt(id_vars=['date', 'other_col'], var_name='original_col_name')

# 步骤2: 从新的 'original_col_name' 列中分割出 'side' 和 'metric_type'
# n=1 表示只分割一次,expand=True 将结果扩展为新的DataFrame列
tmp[['side', 'metric_type']] = tmp['original_col_name'].str.split('_', n=1, expand=True)

# 步骤3: 使用 pivot 函数将 'metric_type' 重新作为列,'value' 作为值
# index 指定新的行索引,columns 指定新的列名,values 指定新的值
out_melt_pivot = (tmp.pivot(index=['date', 'other_col', 'side'],
                            columns='metric_type',
                            values='value')
                     .reset_index() # 将索引重置为列
                     .rename_axis(columns=None) # 移除列索引的名称
                 )

print("\n方法一 (melt + pivot) 结果:")
print(out_melt_pivot)

优点:

小云雀 小云雀

剪映出品的AI视频和图片创作助手

小云雀 1949 查看详情 小云雀
  • 这是Pandas中处理宽到长格式转换的常用且直观的方法。
  • 分步操作清晰,易于理解每一步的作用。

缺点:

  • 需要多个步骤,代码可能稍显冗长。

方法二:基于 MultiIndex 的高级重塑

这种方法利用Pandas的MultiIndex功能在列级别创建分层索引,然后通过 stack 操作将部分索引级别转换为行数据。这是一种更为紧凑和强大的Pandas原生解决方案。

# 步骤1: 设置 'date' 和 'other_col' 为行索引
# 步骤2: 使用 pipe 函数链式操作,通过 str.split 创建列的MultiIndex
#         x.columns.str.split('_', expand=True) 会将 'right_count' 分割为 ('right', 'count')
# 步骤3: 重命名列索引的级别,使其更具可读性
# 步骤4: 对 'side' 级别进行 stack 操作,将其从列转换为行
# 步骤5: 重置索引,将所有索引级别转换为常规列
out_multiindex = (df
   .set_index(['date', 'other_col'])
   .pipe(lambda x: x.set_axis(x.columns.str.split('_', expand=True), axis=1))
   .rename_axis(columns=['side', None]) # 'None' 表示第二个级别没有名称
   .stack('side') # 对 'side' 级别进行堆叠
   .reset_index()
)

print("\n方法二 (MultiIndex) 结果:")
print(out_multiindex)

优点:

  • 纯Pandas操作,无需引入外部库。
  • 对于复杂的重塑任务,MultiIndex提供了强大的灵活性。

缺点:

  • 概念相对复杂,对于初学者可能不易理解。
  • 代码的可读性不如 melt + pivot 或 pyjanitor 直观。

方法三:借助 pyjanitor 库简化操作

pyjanitor 是一个为Pandas提供额外数据清理和转换功能的库,其中的 pivot_longer 函数专门用于简化从宽格式到长格式的转换,其灵感来源于R语言的 tidyr::pivot_longer。

首先,如果尚未安装 pyjanitor,请通过pip安装:

pip install pyjanitor

然后,可以使用以下代码进行重塑:

import janitor # 导入 janitor 库

# 使用 pivot_longer 函数
# index: 指定不变的标识列
# names_to: 指定新的列名元组,其中 '.value' 是一个特殊占位符,表示将原始列名的剩余部分作为新列名
# names_pattern: 使用正则表达式来匹配原始列名并捕获要提取的部分
out_janitor = df.pivot_longer(
    index=['date', 'other_col'],
    names_to=('side', '.value'), # 'side' 是第一个捕获组,'.value' 是第二个捕获组
    names_pattern=r'([^_]+)_([^_]+)' # 匹配 'xxx_yyy' 模式,捕获 'xxx' 和 'yyy'
)

print("\n方法三 (pyjanitor.pivot_longer) 结果:")
print(out_janitor)

优点:

  • 代码极其简洁和直观,尤其是在列名有规律时。
  • names_to 和 names_pattern 参数提供了强大的模式匹配能力。
  • 易于理解和维护。

缺点:

  • 需要安装额外的第三方库 pyjanitor。

注意事项与总结

  • 选择方法:
    • 对于简单的宽到长格式转换,melt 和 pivot 组合是一个稳健的选择,因为它纯粹基于Pandas且易于理解。
    • 如果数据重塑逻辑复杂,或者希望追求更紧凑的Pandas原生代码,可以尝试MultiIndex方法,但需要对Pandas的索引操作有较深入的理解。
    • 对于追求代码简洁性和高可读性,并且不介意引入第三方库的用户,pyjanitor.pivot_longer 是一个极佳的选择,尤其适用于列名具有明确模式的情况。
  • 正则表达式: 在使用 str.split 或 names_pattern 时,理解和正确使用正则表达式至关重要,它决定了如何从原始列名中提取新的分类信息。
  • 数据类型: 重塑操作后,新生成的列(如 count 和 sum)的数据类型可能会变为 object。在进行数值计算前,请确保将其转换为适当的数值类型(例如 int 或 float)。
  • 长格式数据的好处: 将数据转换为长格式通常更适合数据分析、统计建模和使用seaborn、matplotlib等库进行可视化,因为它遵循“整洁数据”(Tidy Data)原则,即每列是一个变量,每行是一个观察值。

掌握这些数据重塑技巧,将使您在处理Pandas DataFrame时更加高效和灵活,从而更好地准备数据以进行深入分析。

以上就是Pandas DataFrame多列重塑:将宽格式数据转换为长格式的实用技巧的详细内容,更多请关注其它相关文章!


# 因为它  # 两会 网站页面优化  # 移动云建设网站费用  # seo佰金手指六六一  # 网络服装网站建设  # seo专业有必要吗  # 惠济区咨询网站搭建优化  # 推广货到付款网站有哪些  # 衡阳网站推广优化公司  # 效果快的seo优化  # 保定网站建设的总体目标  # 链式  # 正则表达式  # 使其  # 第二个  # 多个  # 移除  # 将其  # 转换为  # 是一个  # pip安装  # yy  # 排列 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 微信网页版官方快速登录入口 微信网页版网页版账号直达  优化Log4j2控制台输出性能:解决异步日志瓶颈  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  在Socket.IO连接中实现Access Token自动更新与动态重连  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  Bing引擎入口最新2025 Bing搜索免费官方登录  小米汽车11月交付量突破40000台!雷军:将继续努力  快速CSGO开箱网站指南 CSGO开箱平台推荐  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  邮政快递单号查询入口 邮政快递物流信息在线查询入口  在Typer应用中优雅地处理和重组任意命令行参数  Go RPC HTTP服务正确实现与常见陷阱解析  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  Pyrogram与g4f集成:异步编程实践与常见错误解决  Linux如何构建多环境配置管理_Linux多环境配置方案  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  优化Django表单:提交验证失败后保留用户输入  最新韩小圈网页版登录入口_官网在线观看官方链接  J*aScript类型检查_j*ascript代码规范  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  必由学在线入口 必由学网页版快速登录入口  使用Pandas转换并合并DataFrame:多列映射至统一结构  如何有效阻止外部脚本意外修改内联样式的高度属性  深入理解J*aScript Promise异步执行与微任务队列  Shopware订单对象中获取产品自定义字段的正确方法  Steam官网入口直达 Steam注册及登录步骤  汽车之家官方网站官网入口_汽车之家网页版直接进入  Golang如何优雅处理error_Golang error处理最佳实践总结  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  淘宝支付提示失败如何解决 淘宝支付流程优化方法  qq游戏手机版下载安装_qq游戏移动端入口  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  steam官方入口大全 steam账号注册及操作指南  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  12306选座怎么选到商务座_12306商务座选择与配置说明  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  CSS子选择器:如何区分并样式化嵌套列表的子层级  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  Golang如何使用new_Go new分配内存机制讲解  Go语言HTML解析:利用Goquery精准获取指定元素内容  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法 

搜索