0

0

Python Pandas:重塑宽格式DataFrame为长格式的策略与实践

花韻仙語

花韻仙語

发布时间:2025-10-25 12:34:01

|

390人浏览过

|

来源于php中文网

原创

Python Pandas:重塑宽格式DataFrame为长格式的策略与实践

本教程探讨如何将水平宽度过大的pandas dataframe重塑为更易读的垂直长格式。针对列数能被目标组数整除和不能整除的两种情况,文章详细介绍了使用numpy `reshape`方法进行高效转换,以及利用pandas `multiindex`结合`stack`操作处理复杂场景的专业技巧,旨在帮助用户优化数据结构,提升数据分析效率。

在数据处理和分析中,我们经常会遇到数据以“宽”格式存储的情况,即一个实体的信息横向铺开,占据了大量的列。例如,一个CSV文件可能有数百甚至数千列,这使得数据难以直观阅读和分析。为了更好地进行数据操作和可视化,通常需要将这种宽格式数据转换为“长”格式,使其更符合关系型数据库或某些数据分析工具的要求。本文将详细介绍两种在Pandas中实现这种数据重塑的专业方法:利用NumPy的reshape功能以及结合Pandas MultiIndex和stack操作。

方法一:使用NumPy reshape进行高效重塑

当原始DataFrame的列数能够被目标组的列数整除时,NumPy的reshape方法提供了一种非常高效且简洁的解决方案。这种方法直接作用于底层NumPy数组,避免了Pandas层面的一些开销。

适用场景

  • 原始DataFrame的列数是目标每组列数的整数倍。
  • 数据类型一致,可以直接转换为NumPy数组。
  • 需要将每N列作为一个新的行组。

实现步骤与代码

  1. 将DataFrame转换为NumPy数组。
  2. 使用reshape方法将数组重塑为新的形状。其中,-1表示该维度的大小将由NumPy自动计算,以确保总元素数量不变;另一个参数则指定目标每组的列数。
  3. 将重塑后的NumPy数组转换回Pandas DataFrame,并指定新的列名。

以下是一个具体的示例:

import pandas as pd
import numpy as np

# 假设我们有一个宽格式的DataFrame
# 模拟一个3行12列的DataFrame,列数12可以被6整除
np.random.seed(123)
df = pd.DataFrame(np.random.randint(10, size=(3, 12)))
print("原始DataFrame:")
print(df)
# 原始DataFrame:
#    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

# 目标列名
target_columns = ['GroupA', 'GroupB', 'GroupC', 'GroupD', 'GroupE', 'GroupF']
group_size = len(target_columns) # 每组6列

# 检查列数是否可被整除
print(f"\n原始DataFrame列数: {len(df.columns)}")
print(f"列数 % {group_size} = {len(df.columns) % group_size}")

if len(df.columns) % group_size == 0:
    # 使用NumPy的reshape方法
    df_target = pd.DataFrame(df.to_numpy().reshape(-1, group_size),
                             columns=target_columns)
    print("\n重塑后的DataFrame:")
    print(df_target)
else:
    print("\n列数不能被目标组大小整除,请考虑使用Pandas MultiIndex和stack方法。")

# 重塑后的DataFrame:
#    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的列数必须是目标每组列数的整数倍。如果不是,reshape操作将失败,并抛出ValueError: cannot reshape array of size X into shape (Y, Z)错误。
  • reshape(-1, group_size)中的-1表示NumPy会自动计算行数,以确保总元素数量不变。
  • 这种方法会丢失原始列名信息,因此需要重新指定新的列名。

方法二:利用Pandas MultiIndex和stack处理复杂场景

当原始DataFrame的列数不能被目标组的列数整除时,或者需要更灵活地处理列分组时,结合使用Pandas的MultiIndex和stack操作是一个强大的解决方案。这种方法能够优雅地处理不规则的列分组,并在必要时引入NaN值。

Bika.ai
Bika.ai

打造您的AI智能体员工团队

下载

立即学习Python免费学习笔记(深入)”;

适用场景

  • 原始DataFrame的列数不能被目标每组列数整除。
  • 需要更灵活的列分组逻辑。
  • 可以接受在数据不完整时自动填充NaN。

实现步骤与代码

  1. 创建两个索引数组:一个用于标识每组内的位置(a % group_size),另一个用于标识组的序号(a // group_size)。
  2. 使用set_axis将这两个索引数组作为DataFrame的列MultiIndex。
  3. 使用stack()方法将最内层(即每组内的位置)的列堆叠为行,从而将宽格式转换为长格式。
  4. 再次使用set_axis重命名转换后的列。
  5. 使用reset_index(drop=True)清理索引,使其成为默认的整数索引。

以下是一个具体的示例:

import pandas as pd
import numpy as np

# 模拟一个3行10列的DataFrame,列数10不能被6整除
np.random.seed(123)
df = pd.DataFrame(np.random.randint(10, size=(3, 10)))
print("原始DataFrame:")
print(df)
# 原始DataFrame:
#    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

# 目标列名
target_columns = ['GroupA', 'GroupB', 'GroupC', 'GroupD', 'GroupE', 'GroupF']
group_size = len(target_columns) # 每组6列

print(f"\n原始DataFrame列数: {len(df.columns)}")
print(f"列数 % {group_size} = {len(df.columns) % group_size}") # 结果为2,不能整除

# 创建用于MultiIndex的索引数组
# a % group_size: [0, 1, 2, 3, 4, 5, 0, 1, 2, 3] (表示在组内的位置)
# a // group_size: [0, 0, 0, 0, 0, 0, 1, 1, 1, 1] (表示组的序号)
a = np.arange(len(df.columns))

# 设置MultiIndex,然后stack
df_target_multiindex = (df.set_axis([a % group_size, a // group_size], axis=1)
                          .stack() # 堆叠最内层索引 (即a % group_size)
                          .set_axis(target_columns, axis=1) # 重命名列
                          .reset_index(drop=True)) # 重置索引

print("\n重塑后的DataFrame (使用MultiIndex和stack):")
print(df_target_multiindex)

# 重塑后的DataFrame (使用MultiIndex和stack):
#    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

注意事项

  • 当原始列数不能被目标组大小整除时,stack操作会自动用NaN填充缺失的值。例如,上述示例中,原始DataFrame有10列,每组6列,那么第一组有6列,第二组有4列。在重塑后,第二组的最后两列(GroupE, GroupF)将填充NaN。
  • set_axis用于设置或修改DataFrame的轴标签。在这里,它用于创建列的MultiIndex。
  • stack()操作默认会堆叠最内层的列索引。
  • 由于stack()操作可能导致数据类型从整数变为浮点数(因为引入了NaN),如果需要,可能需要后续进行数据类型转换。

选择合适的重塑策略

  • 优先考虑NumPy reshape: 如果你的数据列数总是目标组大小的精确倍数,并且性能是关键因素,那么NumPy的reshape方法是最佳选择,因为它直接操作底层数组,效率最高。
  • 灵活选择Pandas MultiIndex和stack: 如果你的数据列数不总是精确倍数,或者你需要更灵活地处理列分组,那么Pandas的MultiIndex结合stack方法是更健壮的选择。它能够优雅地处理不完整的数据组,并通过NaN值进行标记。

总结

将宽格式的DataFrame重塑为长格式是数据预处理中的常见任务。本文介绍了两种核心策略:当列数完美匹配时,利用NumPy的reshape方法可以实现高效的转换;而当列数不规则时,结合Pandas的MultiIndex和stack操作则提供了更灵活和鲁棒的解决方案。掌握这些技巧将极大地提升你在处理复杂数据结构时的效率和能力,使你的数据分析工作更加顺畅。在实际应用中,根据数据的特性和具体需求选择最适合的方法至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

60

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

309

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

538

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

27

2026.01.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

397

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

8

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号