当前位置:

首页 > 编程开发 > Pandas宽表转长表:固定列分组堆叠方法

Pandas宽表转长表:固定列分组堆叠方法

本文详细介绍了如何将宽格式的PandasDataFrame重塑为更易读的垂直长表,特别是当需要每N列作为一个逻辑组进行处理时。文章提供了两种核心方法:当总列数是N的倍数时,可高效利用numpy.reshape进行批量转换;而对于总列数不是N的倍数的情况,则通过Pandas的MultiIndex和stack功能实现灵活重塑,并处理可能出现的缺失值。

Pandas DataFrame宽表重塑:按固定列数分组并堆叠为长表

本文详细介绍了如何将宽格式的Pandas DataFrame重塑为更易读的垂直长表,特别是当需要每N列作为一个逻辑组进行处理时。文章提供了两种核心方法:当总列数是N的倍数时,可高效利用`numpy.reshape`进行批量转换;而对于总列数不是N的倍数的情况,则通过Pandas的`MultiIndex`和`stack`功能实现灵活重塑,并处理可能出现的缺失值。

在数据分析和处理中,我们经常会遇到宽格式的数据集,其中包含大量水平排列的列。为了便于分析或满足特定需求(例如,将每N列视为一个逻辑单元并将其堆叠成新的行),我们需要将这种宽表结构重塑为更垂直、更规范的长表。本文将详细介绍两种在Pandas中实现这一目标的方法。

场景描述

假设我们有一个非常宽的CSV文件,例如包含606列,我们已将其导入到Pandas DataFrame中。我们的目标是将原始DataFrame中每6列提取出来,作为一个新的逻辑组,并将其堆叠到目标DataFrame的行中。目标DataFrame应具有预定义的列名,例如['GroupA', 'GroupB', 'GroupC', 'GroupD', 'GroupE', 'GroupF']。

方法一:使用 numpy.reshape(适用于总列数是N的倍数)

当原始DataFrame的总列数是目标组列数(N)的整数倍时,numpy.reshape提供了一种非常高效且简洁的解决方案。这种方法将整个DataFrame的数据扁平化为一个一维数组,然后按照新的行数和列数进行重塑。

核心原理

  1. 将Pandas DataFrame转换为NumPy数组:df.to_numpy()。
  2. 使用reshape(-1, N)进行重塑:
    • -1 表示NumPy会自动计算新的行数。
    • N (例如,6) 表示新的DataFrame将有N列。
    • 这个操作实际上是将原始DataFrame的所有数据(所有行和所有列)按行优先的顺序展平,然后重新排列成N列的新结构。
  3. 将重塑后的NumPy数组转换回Pandas DataFrame,并指定新的列名。

示例代码

假设我们有一个3行12列的DataFrame,需要将其重塑为每6列一组。

import pandas as pd
import numpy as np

# 模拟一个宽格式的DataFrame
np.random.seed(123)
df_wide = pd.DataFrame(np.random.randint(10, size=(3, 12)))
print("原始宽格式DataFrame:")
print(df_wide)
# 输出:
#    0  1  2  3  4  5  6  7  8  9  10  11
# 0  2  2  6  1  3  9  6  1  0  1   9   0
# 1  0  9  3  4  0  0  4  1  7  3   2   4
# 2  7  2  4  8  0  7  9  3  4  6   1   5

# 检查列数是否是目标列数N的倍数
N = 6
if len(df_wide.columns) % N != 0:
    print(f"警告:原始列数 {len(df_wide.columns)} 不是 {N} 的整数倍,此方法可能不适用或需调整。")
else:
    print(f"\n原始DataFrame列数: {len(df_wide.columns)}")
    print(f"列数 {len(df_wide.columns)} 是 {N} 的整数倍: {len(df_wide.columns) % N == 0}")

    # 定义目标DataFrame的列名
    target_columns = ['GroupA', 'GroupB', 'GroupC', 'GroupD', 'GroupE', 'GroupF']

    # 使用numpy.reshape进行重塑
    df_target = pd.DataFrame(df_wide.to_numpy().reshape(-1, N),
                             columns=target_columns)

    print("\n重塑后的目标DataFrame:")
    print(df_target)
    # 输出:
    #    GroupA  GroupB  GroupC  GroupD  GroupE  GroupF
    # 0       2       2       6       1       3       9
    # 1       6       1       0       1       9       0
    # 2       0       9       3       4       0       0
    # 3       4       1       7       3       2       4
    # 4       7       2       4       8       0       7
    # 5       9       3       4       6       1       5

注意事项

  • 列数匹配: 此方法要求原始DataFrame的总列数必须是目标组列数N的整数倍。如果不是,reshape操作会失败或产生意想不到的结果。
  • 数据类型: to_numpy()会尝试统一所有列的数据类型。如果原始DataFrame中存在混合数据类型,可能会导致数据类型转换(例如,全部转换为object或float)。
  • 性能: 对于大型DataFrame,numpy.reshape通常非常高效。

方法二:使用 Pandas MultiIndex 和 stack(适用于任意列数)

当原始DataFrame的列数不是目标组列数N的整数倍时,或者当我们需要更灵活地处理列名和分组逻辑时,Pandas的MultiIndex结合stack方法提供了更通用的解决方案。这种方法通过创建多级列索引来标记每个列所属的组和其在组内的位置,然后利用stack将这些组堆叠起来。

核心原理

  1. 创建列索引数组: 生成一个与原始DataFrame列数相同的序列,例如[0, 1, ..., total_columns - 1]。
  2. 构建多级列索引:
    • 第一级索引 (a % N):表示当前列在每个N列组中的位置(0到N-1)。
    • 第二级索引 (a // N):表示当前列所属的组编号。
    • 通过df.set_axis([a % N, a // N], axis=1)将这两级索引应用于DataFrame的列。
  3. 堆叠数据: 使用df.stack()默认会堆叠最内层(即第二级)的列索引,将其转换为行索引的一部分。这会将每个组的数据垂直堆叠起来。
  4. 重命名列: 堆叠后,原始的第一级索引(a % N)会成为新的列名(0到N-1)。通过set_axis(target_columns, axis=1)将其重命名为目标列名。
  5. 清理索引: reset_index(drop=True)用于清除新生成的行索引,使其变为默认的整数索引。

示例代码

假设我们有一个3行10列的DataFrame,需要将其重塑为每6列一组。由于10不是6的倍数,部分行将包含NaN。

import pandas as pd
import numpy as np

# 模拟一个宽格式的DataFrame,列数不是6的倍数
np.random.seed(123)
df_wide_uneven = pd.DataFrame(np.random.randint(10, size=(3, 10)))
print("原始宽格式DataFrame (列数非倍数):")
print(df_wide_uneven)
# 输出:
#    0  1  2  3  4  5  6  7  8  9
# 0  2  2  6  1  3  9  6  1  0  1
# 1  9  0  0  9  3  4  0  0  4  1
# 2  7  3  2  4  7  2  4  8  0  7

N = 6
print(f"\n原始DataFrame列数: {len(df_wide_uneven.columns)}")
print(f"列数 {len(df_wide_uneven.columns)} 是 {N} 的整数倍: {len(df_wide_uneven.columns) % N == 0}")

# 定义目标DataFrame的列名
target_columns = ['GroupA', 'GroupB', 'GroupC', 'GroupD', 'GroupE', 'GroupF']

# 创建列索引数组
a = np.arange(len(df_wide_uneven.columns))

# 构建MultiIndex并堆叠
df_target_uneven = (df_wide_uneven.set_axis([a % N, a // N], axis=1) # 创建MultiIndex: (列内序号, 组号)
                                  .stack()                             # 堆叠最内层索引 (组号)
                                  .set_axis(target_columns, axis=1)  # 重命名列
                                  .reset_index(drop=True))           # 重置索引

print("\n重塑后的目标DataFrame (处理非倍数列数):")
print(df_target_uneven)
# 输出:
#    GroupA  GroupB  GroupC  GroupD  GroupE  GroupF
# 0       2       2       6       1     3.0     9.0
# 1       6       1       0       1     NaN     NaN
# 2       9       0       0       9     3.0     4.0
# 3       0       0       4       1     NaN     NaN
# 4       7       3       2       4     7.0     2.0
# 5       4       8       0       7     NaN     NaN

注意事项

  • 缺失值处理: 当原始列数不是N的倍数时,最后一组(或多组)可能不完整。stack操作会自动用NaN填充缺失的单元格,以确保每行都有N列。因此,结果DataFrame的数据类型可能会变为浮点型(如果原始数据是整数)。
  • 索引清理: reset_index(drop=True)是必要的,因为它会移除stack操作生成的额外索引层,使DataFrame的索引干净。
  • 灵活性: 这种方法在处理复杂分组逻辑或需要保留更多原始列信息时更具优势。

总结

将宽格式的Pandas DataFrame重塑为按固定列数分组的长表是数据清洗和预处理的常见任务。

  • 对于列数是目标组列数N的整数倍的情况,推荐使用df.to_numpy().reshape(-1, N),它简洁高效。
  • 对于列数不是N的整数倍的情况,或者需要更灵活地处理列名和缺失值时,应采用Pandas MultiIndex结合stack的方法。

选择哪种方法取决于你的具体数据结构和对效率、灵活性以及缺失值处理的需求。理解这两种方法的原理和适用场景,能够帮助你更有效地处理各种数据重塑任务。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
blender hdr渲染设置哔哩哔哩详细操作教程
blender hdr渲染设置哔哩哔哩详细操作教程

学习如何在Blender中使用HDRI进行渲染。通过World着色器连接Environment Texture节点,调整光照强度与环境方向,解决背景显示与曝光问题,快速提升场景真实感。

sql条件判断字符串不包含某个字符串的方法详解
sql条件判断字符串不包含某个字符串的方法详解

深入详解在SQL中进行条件判断字符串不包含某个子串的方法,涵盖标准NOT LIKE、各主流数据库(MySQL、PostgreSQL、SQL Server、Oracle)专有位置函数、正则表达式判断,剖析NULL值三值逻辑陷阱及全表扫描性能优化策略。

IDM安装配置教程及详细操作步骤
IDM安装配置教程及详细操作步骤

新手必读的IDM安装配置教程。从官方下载开始,逐步讲解如何完成Windows安装、启用Chrome/Edge/Firefox浏览器扩展、设置默认保存目录及调整连接线程,解决IDM不弹窗接管下载的常见问题。

linux系统终止进程快捷键是什么及使用方法
linux系统终止进程快捷键是什么及使用方法

全面解析Linux终端中终止进程的核心快捷键(Ctrl+C、Ctrl+Z、Ctrl+\)的原理、区别与具体使用方法,附后台恢复与强制终止全流程指南。

Windows10官方镜像U盘启动盘制作教程
Windows10官方镜像U盘启动盘制作教程

详解使用微软官方媒体创建工具制作 Windows 10 安装U盘的步骤,包括直接写入和ISO备份两种方式,并提供启动验证与故障排查建议。

consul配置文件在哪及默认路径查找方法
consul配置文件在哪及默认路径查找方法

找不到 Consul 配置文件?直接搜索文件往往无效。本文详解如何根据启动参数(-config-file/-config-dir)在 Linux (/etc/consul.d)、Docker (/consul/config) 和 Windows 环境中准确定位 Consul 配置,并提供配置校验步骤。

WPS 表格 COUNTIF 函数使用教程
WPS 表格 COUNTIF 函数使用教程

在WPS表格中使用COUNTIF进行单条件计数时,常因区域引用不当或条件格式差异导致结果偏差。本文详解COUNTIF的因果逻辑,提供区域固定、通配符应用及数据类型校验的实操方法,并说明何时应改用COUNTIFS或其他方案。

WPS 表格分页预览怎么调整分页符
WPS 表格分页预览怎么调整分页符

详解WPS表格中如何通过分页预览视图调整横向与纵向分页符,解决打印时标题被截、数据错位问题。涵盖手动插入删除分页符及缩放比例配合技巧,确保打印输出符合预期。

解决win10运行3DMAX自动重启的方法
解决win10运行3DMAX自动重启的方法

win10操作系统下运行3DMAX总是出现自动重启电脑的问题要怎么办,一般就是检测电源供电、硬件等问题即可,那么下面我们一起看看win10运行3DMAX自动重启解决方法。win10系统运行3DMAX自动重启:1、检测电源供电稳定,是否使用了电脑合适的电源大小。2、如果是新升级、添加硬件后出问题,拆除后试试。3、将电脑设置为——干净启动模式,启动电脑——全盘杀毒再尝试。4、如果以上调试无效,您可以报修或者联系就近服务站调试检修。5、如果你的CUP有16个线程将它变为14个线程尝试打开3DMAX。

WPS 表格图表标题怎么修改
WPS 表格图表标题怎么修改

WPS表格图表标题还是“系列1”?本文教你快速选中图表、直接编辑标题文字,或在没有标题时通过功能区添加。包含解决标题被截断的布局技巧,以及何时该用动态引用替代手动修改。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Adobe Acrobat Pro macOS版
Adobe Acrobat Pro macOS版
Mac

Adobe Acrobat Pro 是面向办公、法务、财务、教育及出版用户的专业PDF处理软件,可在Mac上创建、编辑、转换、合并和保护文档,并提供OCR文字识别、表单、批注、内容比较、敏感信息遮盖及电子签名功能。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

WINDOWS 更多
3ds max(3dmax)
3ds max(3dmax)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

PixTV 网页版
PixTV 网页版
Windows

PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

AutoCAD Windows版
AutoCAD Windows版
Windows

AutoCAD 是 Autodesk 推出的专业计算机辅助设计软件,Windows 版支持精确二维绘图、三维实体与曲面建模、图纸标注、布局发布和任务自动化,并包含多套行业专业化工具组合,适用于建筑、机械、电气、工程建设及制造设计人员。