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


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

本文详细介绍了如何将具有大量水平列的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


相关推荐: J*aScript与HTML元素交互:图片点击事件与链接处理教程  如何在CSS中设置背景图像:一个全面指南  PHP页面重载时变量值不重置的实现方法  word页码灰色不能用如何解决  Apple Music无故扣费引质疑  不吃碳水化合物是健康减肥的好办法吗  全球各国上班时间表外贸邮件时间  动漫岛在线动漫网 动漫岛动漫在线观看官方入口  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  在React中正确处理HTML input type="number"的数值类型  快递查询,一键速查  追剧达人如何发弹幕  Lar*el Eloquent中通过Join查询关联数据表:解决多行子查询问题  word文档行距怎么调?word文档调行距的操作步骤  咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法  向日葵客户端怎么进行语音通话_向日葵客户端语音通话功能使用方法  深入理解Python对象引用与链表属性赋值  优化长HTML属性值:SonarQube警告与实用策略  动漫岛汉化官网网 动漫岛官方动漫汉化地址  深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法  手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  QQ邮箱注册地址 免费获取QQ邮箱账号  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  百度网盘网页入口链接分享 百度网盘官网入口网页登录  Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频  微信客户端怎么查看二维码_微信客户端个人二维码查看方法  FotoBalloon图片左右镜像教程  《植物大战僵尸3》火龙草作用介绍  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  解决Flex容器横向滚动内容截断与偏移问题  OPPO A3 WiFi频繁断开怎么办 OPPO A3网络优化技巧  j*a中ArrayBlockingQueue的使用  Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程  《米姆米姆哈》米姆获取及技能攻略  解决Go encoding/json 将JSON大数字解析为浮点数的问题  diskgenius分区工具如何设置Bios启动项  《下一站江湖2》风神腿获取攻略  苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法  《绝区零》2.3前瞻|直播|内容介绍  知音漫客官网首页入口_知音漫客热门漫画推荐  优化响应式标题底部边框:CSS实现技巧与最佳实践  口腔诊所管理软件推荐  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  鸣潮历史学家灯塔位置一览  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践 

 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.