如何将宽格式数据框重塑为更易读的垂直格式


如何将宽格式数据框重塑为更易读的垂直格式

本文详细介绍了如何将具有大量水平列的Pandas DataFrame重塑为更紧凑、垂直的格式。我们探讨了两种主要方法:一种是利用NumPy的`reshape`功能,适用于列数能被目标组数整除的情况;另一种是结合Pandas的`MultiIndex`和`stack`操作,以应对列数不能完美整除的场景,并提供了详细的代码示例和注意事项,旨在帮助用户高效地进行数据重塑。

在数据分析和处理中,我们经常会遇到宽度过大的DataFrame,即拥有非常多列的数据集。这种“宽格式”数据在某些分析场景下可能难以理解和操作。例如,一个包含600多列的CSV文件,如果每6列代表一组相关数据,我们可能希望将其重塑为只有6列的“长格式”数据,其中原始的列被堆叠成行。本文将详细介绍两种有效的方法来解决这一问题。

方法一:使用NumPy的reshape功能(适用于列数完美整除的情况)

当原始DataFrame的总列数能够被目标列数(例如,每6列一组)完美整除时,NumPy的reshape方法提供了一种高效且简洁的解决方案。

核心原理

  1. 转换为NumPy数组:首先将Pandas DataFrame转换为NumPy数组。这样可以去除DataFrame的列名,并直接操作底层数值。
  2. 重塑数组:使用numpy.reshape(rows, columns)函数来重塑数组。
    • rows参数:设置为-1,表示NumPy会根据数组的总元素数量和指定的列数自动计算行数。
    • columns参数:设置为目标列数(例如,6)。
  3. 创建新的DataFrame:将重塑后的NumPy数组转换回Pandas DataFrame,并赋予新的列名。

示例代码

假设我们有一个名为groups.csv的文件,其中包含606列,我们希望将其重塑为6列,每6列一组。

import pandas as pd
import numpy as np

# 模拟一个宽格式DataFrame
# 实际应用中,您会从CSV文件加载
# df = pd.read_csv("groups.csv")

# 模拟数据,3行12列,用于演示
np.random.seed(123)
df = pd.DataFrame(np.random.randint(10, size=(3, 12)))
print("原始DataFrame:")
print(df)
print(f"\n原始DataFrame的列数: {len(df.columns)}")
print(f"列数 % 6 的余数: {len(df.columns) % 6}")

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

# 使用to_numpy()转换为NumPy数组,然后进行reshape
# -1 让NumPy自动计算行数
df_target = pd.DataFrame(df.to_numpy().reshape(-1, 6),
                       columns=target_columns)

print("\n重塑后的DataFrame (使用NumPy reshape):")
print(df_target)

输出示例:

原始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

原始DataFrame的列数: 12
列数 % 6 的余数: 0

重塑后的DataFrame (使用NumPy reshape):
   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操作将抛出错误。
  • to_numpy()会丢弃原始的列名信息,因此需要手动为新DataFrame指定列名。

方法二:使用Pandas MultiIndex和stack(适用于列数不完美整除的情况)

当原始DataFrame的列数不能被目标列数完美整除时,或者需要更灵活地处理列分组时,Pandas的MultiIndex结合stack操作提供了一个更强大的解决方案。此方法能够处理不规则的列数,并在必要时填充NaN。

6pen Art 6pen Art

AI绘画生成

6pen Art 213 查看详情 6pen Art

核心原理

  1. 创建MultiIndex:通过对原始列索引进行取模运算(%)和整数除法(//),创建一个两级的MultiIndex。
    • 取模运算(a % 6)将为每组内的列提供一个0到5的索引。
    • 整数除法(a // 6)将为每组提供一个组编号。
  2. 设置新的轴标签:使用set_axis将这个MultiIndex应用到DataFrame的列轴上。
  3. 堆叠DataFrame:使用stack()方法将DataFrame从宽格式转换为长格式。stack()会根据MultiIndex的内层级别进行堆叠。
  4. 重命名列:堆叠后,DataFrame的列名将是MultiIndex的内层级别。我们需要使用set_axis将其重命名为我们目标列名。
  5. 重置索引:最后,使用reset_index(drop=True)清理索引。

示例代码

假设我们有一个3行10列的DataFrame,我们仍希望将其重塑为6列。

import pandas as pd
import numpy as np

# 模拟一个宽格式DataFrame,列数不被6整除
np.random.seed(123)
df = pd.DataFrame(np.random.randint(10, size=(3, 10)))
print("原始DataFrame:")
print(df)
print(f"\n原始DataFrame的列数: {len(df.columns)}")
print(f"列数 % 6 的余数: {len(df.columns) % 6}")

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

# 创建一个表示列分组的MultiIndex
# a % 6: 0,1,2,3,4,5,0,1,2,3 (每组内的列索引)
# a // 6: 0,0,0,0,0,0,1,1,1,1 (组编号)
a = np.arange(len(df.columns))

df_target = (df.set_axis([a % 6, a // 6], axis=1) # 设置MultiIndex作为列名
                .stack()                          # 堆叠数据
                .set_axis(target_columns, axis=1) # 设置新的列名
                .reset_index(drop=True))          # 重置索引

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

输出示例:

原始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

原始DataFrame的列数: 10
列数 % 6 的余数: 4

重塑后的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值,因为不是所有的组都能填满6列。这通常是可接受的行为,表示数据缺失。
  • 此方法比NumPy的reshape稍微复杂,但提供了更高的灵活性,尤其是在处理不规则数据时。
  • 由于数据类型转换(例如,整数列中引入NaN会导致列变为浮点型),可能需要后续的数据类型处理。

总结

将宽格式的DataFrame重塑为长格式是数据预处理中的常见任务。选择哪种方法取决于您的具体数据特征和需求:

  • NumPy的reshape:当原始列数能够被目标列数完美整除时,这是最简洁、最高效的方法。
  • Pandas MultiIndex和stack:当列数不能完美整除,或者您需要更精细地控制重塑过程,且不介意可能引入NaN值时,此方法更为适用。

理解并熟练运用这两种技术,将极大地提高您在数据清洗和准备阶段的效率。务必根据您的数据特点和分析目标,选择最合适的重塑策略。

以上就是如何将宽格式数据框重塑为更易读的垂直格式的详细内容,更多请关注其它相关文章!


# 详细介绍  # 概念型海报文案网站推广  # 泰安推广线上营销方案  # 宁波seo系统开发  # 固始本地网站建设平台  # 小说的seo  # fiam seo锁体  # 唐山市seo优化  # 密云快速优化网站  # 象山高端网站建设  # 湘桥网站建设公司  # 易读  # csv  # 两种  # 每组  # 您的  # 适用于  # 如何将  # 浮点  # 转换为  # 将其  # csv文件  # 数据清洗 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 如何在解析前预检查XML文件的完整性? 比如检查文件大小或特定结束标签  Win10输入法不见了怎么办 Win10找回语言栏图标教程  哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南  如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成  优化长HTML属性值:SonarQube警告与实用策略  外卖小程序对接第三方配送  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  海外搜索引擎推广效果怎么样,怎么分析效果!  飞飞漫画漫画阅读官网_飞飞漫画漫画阅读官网进入阅读  小红书如何引流到私信?引流到私信有用吗?  作业帮网页版不用下载入口 在线问老师快速答疑  Flash AS3.0简易相册制作  《豆瓣》私信用户方法  b站怎么查看视频的码率_b站视频码率查看方法  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  Composer如何使用composer-plugin-api开发自定义插件  J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解  Win11怎么设置分辨率 Win11显示设置调整分辨率及刷新率修改  画质怪兽120帧安卓和平精英免费版  PHP 4 函数中引用参数的默认值限制与解决方案  C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  申通快件单号查询平台 申通包裹物流动态跟踪  Apple Music无故扣费引质疑  mysql中外键约束如何使用_mysql FOREIGN KEY操作  如何在mysql中使用索引提示_mysql索引提示优化方法  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】  《深林》冬季章节图文攻略  HTML中多图片上传与预览:解决ID冲突的专业指南  优化 WooCommerce 产品价格显示与自定义短代码集成  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  《全民k歌》音乐怎么下载到本地2025  小红书网页版在线直达 小红书网页版免费登录入口  自定义你的VS Code状态栏,监控关键信息  如何定制PrimeNG Sidebar的背景颜色  嘴唇干裂起皮怎么办 唇部护理与预防干裂的方法【详解】  VS Code中的Tailwind CSS IntelliSense插件使用技巧  抖音火山版如何进行提现  使用VS Code作为你的个人知识管理系统  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  《随手记》备份数据方法  b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  iphone16系列配置参数介绍  Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项 

 2025-10-25

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.