0

0

Pandas数据重塑:将行级页面数据转换为列级格式

DDD

DDD

发布时间:2025-11-18 14:08:00

|

302人浏览过

|

来源于php中文网

原创

Pandas数据重塑:将行级页面数据转换为列级格式

本文详细介绍了如何使用pandas的`pivot`函数将行级别的数据(例如按页码分布的报告信息)高效地转换为列级别格式。通过一个具体的示例,文章演示了如何利用`index`、`columns`和`values`参数进行数据透视,并结合`add_prefix`、`reset_index`和`rename_axis`等方法,实现将特定行数据转换为带有描述性新列名的列,从而优化数据结构以满足分析需求。

在数据分析和处理中,我们经常会遇到需要将数据的行转换为列的场景,这种操作通常被称为数据透视(pivot)。当原始数据以“长格式”存储,即多个相关属性值分散在不同的行中时,为了便于比较和分析,我们可能需要将其转换为“宽格式”,使每个属性值成为一个独立的列。本文将以一个具体的示例,讲解如何使用Pandas库中的pivot函数实现这一转换,特别是针对具有层级结构(如年度报告中的页面信息)的数据。

场景描述与初始数据结构

假设我们有一份关于公司年度报告的数据,其中包含了公司(FIRM)、年份(YEAR)、报告页码(Report Page)以及对应页码的某个数值(Value1)。初始数据以行级别存储,即同一份报告的不同页面信息分别占据不同的行。

以下是示例数据及其DataFrame表示:

import pandas as pd

data = {
    'FIRM': ['A', 'A', 'B', 'B'],
    'YEAR': [2012, 2012, 2013, 2013],
    'Report Page': [1, 2, 1, 2],
    'Value1': [10, 15, 20, 25]
}

df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)

输出的DataFrame结构如下:

原始DataFrame:
  FIRM  YEAR  Report Page  Value1
0    A  2012            1       10
1    A  2012            2       15
2    B  2013            1       20
3    B  2013            2       25

我们的目标是将每个报告(由FIRM和YEAR唯一标识)的页面信息(Value1)从行转换为列。具体来说,我们希望将Report Page列中的页码转换为新的列名的一部分,例如Value1_Page1、Value1_Page2,并将对应的Value1值填充到这些新列中。

期望的输出格式如下:

  FIRM  YEAR  Value1_Page1  Value1_Page2
0    A  2012            10            15
1    B  2013            20            25

使用 pandas.pivot 进行数据重塑

Pandas的pivot函数是实现这种数据重塑的核心工具。它允许我们指定哪些列作为新的索引(行)、哪些列作为新的列名,以及哪些列的值将填充到新的DataFrame中。

pivot函数的基本语法是:df.pivot(index=None, columns=None, values=None)。

  • index: 用于构建新DataFrame索引的列或列的列表。
  • columns: 用于构建新DataFrame列名的列。
  • values: 用于填充新DataFrame值的列。

根据我们的目标,我们需要:

SSP网店系统单用户免费普及版
SSP网店系统单用户免费普及版

前后台订单管理页添加商品缩图显示 后台系统设置可直接对商品缩图大小进行设置 去掉商品图片水印功能 上传一张图片,可同时生成列表页缩图及商品详细页缩图,以不同的大小满足页面不同的需要 商品收藏添加批量删除功能 修改商品详细页会员等级显示BUG 优化缩图生成功能(注:因此次优化已更换上传内核,所以有可能会影响已上传商品图片数据) 加入简繁转换 前台订单管理添加单订单在线支付功能 修正VS081样式前台

下载
  1. 以FIRM和YEAR作为新的索引,因为它们共同定义了一个唯一的报告。
  2. 以Report Page作为新的列名,因为我们希望每个页码成为一个独立的列。
  3. 以Value1作为填充新列的值。

因此,我们可以这样使用pivot函数:

# 步骤1: 使用pivot函数进行透视
pivoted_df = df.pivot(index=['FIRM', 'YEAR'], columns='Report Page', values='Value1')
print("\n透视后的DataFrame (初步):")
print(pivoted_df)

执行上述代码后,pivoted_df的输出将是:

透视后的DataFrame (初步):
Report Page     1   2
FIRM YEAR            
A    2012      10  15
B    2013      20  25

可以看到,FIRM和YEAR已经成为新的复合索引,Report Page的值(1和2)成为了新的列名,并且Value1的值被正确地填充。

后续处理:重命名列和重置索引

虽然pivot函数完成了大部分工作,但为了达到最终期望的输出格式,我们还需要进行一些后处理:

  1. 添加列名前缀: 原始的列名是页码(1, 2),我们希望它们是Value1_Page1、Value1_Page2。
  2. 重置索引: FIRM和YEAR目前是索引,我们希望它们作为常规列。
  3. 清理列索引名称: pivot操作可能会在列索引上留下一个名称(例如Report Page),这通常是不需要的。

我们可以通过链式操作来完成这些步骤:

final_df = (
    df.pivot(index=['FIRM', 'YEAR'], columns='Report Page', values='Value1')
    .add_prefix('Value1_Page')  # 为新生成的列名添加前缀
    .reset_index()              # 将索引(FIRM, YEAR)转换为常规列
    .rename_axis(None, axis=1)  # 清除列索引的名称
)

print("\n最终转换后的DataFrame:")
print(final_df)

最终输出的DataFrame将完全符合我们的预期:

最终转换后的DataFrame:
  FIRM  YEAR  Value1_Page1  Value1_Page2
0    A  2012            10            15
1    B  2013            20            25

注意事项与扩展

  1. pivot与pivot_table的区别

    • pivot要求index和columns的组合必须是唯一的。如果存在重复组合,pivot会抛出错误。
    • pivot_table功能更强大,可以处理重复组合,并通过aggfunc参数指定聚合函数(如sum、mean等)来处理重复值。如果你的数据可能存在相同FIRM、YEAR和Report Page的行,并且需要对Value1进行聚合,那么pivot_table是更合适的选择。
  2. 处理页面数量不一致的情况: 本解决方案能够自然地处理不同报告具有不同页面数量的情况。如果某个报告缺少某一页的数据,相应的新列中将填充NaN(Not a Number)。例如,如果报告A只有Page1,而没有Page2,那么Value1_Page2列对于报告A的行将是NaN。

  3. 多值列的透视: 如果需要透视多个值列(例如除了Value1还有Value2),可以将values参数设置为一个列表,例如values=['Value1', 'Value2']。在这种情况下,add_prefix可能需要更精细的控制,或者在透视后手动重命名列。

总结

通过本文的详细讲解,我们学习了如何利用Pandas的pivot函数将行级别的页面数据转换为列级别格式。结合add_prefix、reset_index和rename_axis等辅助函数,我们可以灵活地重塑DataFrame,使其更符合数据分析和报告的需求。掌握pivot及其相关操作是Pandas数据处理中一项非常实用的技能,能够显著提高数据清洗和准备的效率。

相关专题

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

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

52

2025.12.04

treenode的用法
treenode的用法

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

535

2023.12.01

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

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

17

2025.12.22

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

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

21

2026.01.06

数据分析的方法
数据分析的方法

数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。php中文网为大家带来了数据分析的相关知识、以及相关文章等内容。

466

2023.07.04

数据分析方法有哪几种
数据分析方法有哪几种

数据分析方法有:1、描述性统计分析;2、探索性数据分析;3、假设检验;4、回归分析;5、聚类分析。本专题为大家提供数据分析方法的相关的文章、下载、课程内容,供大家免费下载体验。

279

2023.08.07

网站建设功能有哪些
网站建设功能有哪些

网站建设功能包括信息发布、内容管理、用户管理、搜索引擎优化、网站安全、数据分析、网站推广、响应式设计、社交媒体整合和电子商务等功能。这些功能可以帮助网站管理员创建一个具有吸引力、可用性和商业价值的网站,实现网站的目标。

731

2023.10.16

数据分析网站推荐
数据分析网站推荐

数据分析网站推荐:1、商业数据分析论坛;2、人大经济论坛-计量经济学与统计区;3、中国统计论坛;4、数据挖掘学习交流论坛;5、数据分析论坛;6、网站数据分析;7、数据分析;8、数据挖掘研究院;9、S-PLUS、R统计论坛。想了解更多数据分析的相关内容,可以阅读本专题下面的文章。

508

2024.03.13

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.9万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.8万人学习

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

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