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

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 pddf = pd.DataFrame({    'date': ['2023-12-01', '2023-12-05', '2023-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  sum0  2023-12-01         a  right      4    21  2023-12-05         b  right      7    32  2023-12-07         c  right      9    53  2023-12-01         a   left      1    04  2023-12-05         b   left      8    85  2023-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)

优点:

这是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多列重塑:将宽格式数据转换为长格式的实用技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1381174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
正确配置Gemini Pro API安全设置以避免内容屏蔽
上一篇 2025年12月14日 22:43:56
Python中安全高效地从嵌套JSON数据中提取特定字段值
下一篇 2025年12月14日 22:44:11

相关推荐

  • 获取日期中的周数:CodeIgniter 教程

    本教程旨在帮助开发者在 CodeIgniter 框架中,从日期字符串中准确提取周数。我们将使用 PHP 内置的 DateTime 类,并提供详细的代码示例和注意事项,确保您能够轻松地在项目中实现此功能。 使用 DateTime 类获取周数 PHP 的 DateTime 类提供了一种便捷的方式来处理日…

    2026年5月10日
    100
  • 虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版

    虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版

    虫虫漫画官网入口为www.ccmh.com,用户可直接通过浏览器访问,支持多端适配与账号同步功能,界面简洁无广告,提供海量国漫、日漫、韩漫资源,涵盖恋爱、玄幻等热门题材,更新及时,支持多种阅读模式及离线缓存,阅读体验流畅。 虫虫漫画直接进入官网入口在哪里?这是不少网友都关注的,接下来由PHP小编为大…

    2026年5月10日 用户投稿
    100
  • Python正则表达式:处理数字不同情况的替换

    本文旨在帮助读者理解和解决在使用Python正则表达式进行数字替换时遇到的问题。通过具体示例,详细解释了如何正确匹配和替换不同格式的数字,避免常见的匹配陷阱,并提供可直接使用的代码示例。掌握这些技巧,能有效提高处理文本数据的效率和准确性。 在使用Python的re模块进行字符串替换时,正则表达式的编…

    2026年5月10日
    000
  • 如何使用AutoKeras训练AI大模型?自动构建神经网络的指南

    AutoKeras在AI大模型训练中扮演“智能建筑师”角色,通过自动化神经架构搜索与超参数优化,加速模型开发迭代。它基于Keras/TensorFlow,支持图像、文本、结构化数据任务,提供ImageClassifier、TextClassifier等接口,用户只需设定max_trials和epoc…

    2026年5月10日
    300
  • 如何根据当前月份动态排序 1-12 月?

    根据当前月份动态排序 1-12 月 想要实现根据当前月份动态排序 1-12 月,可以通过参考以下方法: 创建月份数组:首先,创建一个包含 1-12 月信息(如名称和值)的月份数组。获取当前月份:获取 javascript 中表示当前月份的数值(从 0 到 11)。重新排序月份数组:使用 javasc…

    2026年5月10日
    000
  • HTML/CSS中链接与按钮的正确嵌套:避免文本超链接化与结构优化指南

    本教程旨在解决HTML中链接()与按钮(button)或类按钮元素嵌套不当导致非预期文本超链接化的问题。我们将通过修正标签的错误闭合,并推荐使用 等语义化元素作为链接内容并应用按钮样式,来创建功能正确、结构清晰且包含文本或图像的交互式按钮,从而提升页面的可维护性和用户体验。 在网页开发中,我们经常需…

    2026年5月10日
    000
  • 使用JavaScript正则表达式验证DFA字符串

    本文旨在探讨如何高效地使用javascript的内置正则表达式功能来验证符合特定确定性有限自动机(dfa)规则的字符串。我们将对比手动构建状态转换表的复杂性与利用正则表达式的简洁与强大,并通过具体代码示例展示如何将dfa的正则表达式直接应用于字符串验证,从而实现更可靠、易维护的解决方案。 确定性有限…

    2026年5月10日
    000
  • Angular mat-tab 高度自适应与布局优化指南

    本教程旨在解决Angular Material mat-tab组件在Flexbox布局中无法自动填充父容器高度的问题。文章将深入分析问题根源,并提供使用CSS深度选择器(::ng-deep)精确控制mat-tab-body-wrapper和mat-tab-body高度的解决方案,确保组件在指定布局下…

    2026年5月10日
    000
  • 高效处理Selenium抓取中的特殊HTML字符:JavaScript注入法

    本教程旨在解决使用Selenium的.text方法抓取网页内容时,因保留不可见特殊HTML字符(如连字符、非断行空格等)导致的数据清洗难题。文章核心内容是介绍如何通过driver.execute_script方法注入JavaScript代码,在提取文本之前直接从DOM中移除这些包含特殊字符的HTML…

    2026年5月10日
    000
  • html如何制作水印_HTML水印(文字/图片)添加与设置方法

    使用CSS和HTML可实现网页水印,方法包括:一、通过background-image与data URI嵌入斜向文字水印;二、利用伪元素结合transform旋转生成叠加文字层;三、插入img标签或背景图设置固定位置图片水印;四、用Canvas绘制多行斜纹并转Base64作背景;五、通过禁用右键、屏…

    2026年5月10日
    100
  • PHP中验证Base64编码字符串有效性的实用指南

    本教程将详细介绍在PHP中如何有效验证Base64编码字符串的有效性,特别是针对常见的数据URI格式(如data:image/jpeg;base64,…)。我们将探讨利用base64_decode和base64_encode函数进行往返验证的核心技术,并提供实用的代码示例及重要注意事项,…

    2026年5月10日
    000
  • 使用CSS Grid实现不规则列布局:告别传统表格的限制

    本教程详细阐述如何利用css grid实现复杂的、不规则的列布局,尤其适用于那些传统html表格难以实现的块状结构。文章将通过具体的css属性和html结构示例,指导读者如何定义网格、控制子项的跨度与位置,以及优化自动布局流程,从而高效构建灵活且响应式的页面布局。 1. 传统表格的局限与CSS Gr…

    2026年5月10日
    000
  • WordPress自定义主题中根据文章数量动态显示/隐藏“查看更多”按钮的教程

    本教程旨在指导开发者如何在wordpress自定义主题中,根据特定文章类型和分类的实际数量,动态控制“查看更多”按钮的显示与隐藏。我们将利用 wp_query 及其 found_posts 属性,精确判断符合条件的文章总数,从而在有更多文章时显示按钮,在无文章时显示提示信息,优化用户体验。 引言 在…

    2026年5月10日
    000
  • CSS Flexbox:在居中对齐时优雅地控制元素间距

    本文深入探讨了在css flexbox布局中,当容器使用`display: flex`和`justify-content: center`进行居中对齐时,如何有效地在子元素之间添加间距。我们将分析传统方法(如子元素的`margin`和容器的`padding`)的局限性,并重点介绍现代且推荐的`gap…

    2026年5月10日
    000
  • C++ 如何替换字符串中的部分内容_C++ 替换字符串内容的常用技巧

    答案:C++中常用字符串替换方法包括使用find与replace循环替换所有匹配项,示例代码展示如何通过while循环查找并更新位置实现全局替换;单次替换只需查找第一个匹配并执行一次replace操作;若需忽略大小写,须自定义查找函数如findIgnoreCase进行字符转小写比较;对于模式匹配类替…

    2026年5月10日
    100
  • C#如何处理异常?C# try-catch-finally最佳实践与常见错误规避

    正确使用 try-catch-finally 应捕获具体异常、用 finally 或 using 释放资源、避免空 catch 和裸抛异常,确保异常日志记录并保留堆栈跟踪,提升代码健壮性与可维护性。 在C#中,异常处理是保障程序稳定运行的重要机制。正确使用 try-catch-finally 结构不…

    2026年5月10日
    000
  • CSS的display属性有哪些值?inline和block有什么区别?

    CSS的display属性有哪些值?inline和block有什么区别?CSS的display属性有哪些值?inline和block有什么区别?CSS的display属性有哪些值?inline和block有什么区别?CSS的display属性有哪些值?inline和block有什么区别?

    css的display属性通过定义元素的显示方式来控制网页布局。1.block元素独占一行,可设置宽高,默认如div、p等;2.inline元素不独占行,宽高由内容决定,如span、a;3.inline-block兼具block和inline特性,可并排显示且能设尺寸;4.none隐藏元素且不占空间…

    2026年5月10日 用户投稿
    000
  • Nginx 子目录应用URI重写与参数传递教程

    本教程详细阐述了如何在Nginx中为PHP应用实现子目录URI重写,特别是如何从请求URI中剥离子目录路径并将其余部分作为参数传递给主入口文件。通过try_files和rewrite指令的组合,本教程提供了一种高效且准确的解决方案,以替代Apache .htaccess的RewriteRule功能,…

    2026年5月10日
    000
  • 优化 Laravel Eloquent 查询:高效构建用户排行榜数据

    本教程详细讲解如何优化 Laravel Eloquent 查询以高效生成基于关联记录计数的排行榜。通过识别并消除冗余的 whereHas 子句,并巧妙利用 withCount 的条件闭包,我们能显著提升查询性能,大幅缩短数据获取时间,从而改善用户体验并降低数据库负载。 在 laravel 应用开发中…

    2026年5月10日
    000
  • CSS多级下拉菜单布局优化:解决li元素高度自适应与多列排版问题

    本文深入探讨了css多级下拉菜单中li元素高度自适应与多列排版布局的优化策略。针对传统flex布局可能遇到的高度填充问题,文章介绍了如何利用column-count属性在父容器中创建多列布局,并结合float: left使子li元素在列中自然排列,实现动态高度适应,从而构建出结构清晰、内容丰富的响应…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信