如何使用Pandas将行数据转换为列数据

花韻仙語
发布: 2025-11-19 13:15:41
原创
201人浏览过

如何使用pandas将行数据转换为列数据

本文详细介绍了如何利用Pandas库中的`pivot`函数,将包含多行页面级别信息的原始数据高效地重塑为以列形式展示页面数据的结构。通过指定索引、列和值参数,结合`add_prefix`、`reset_index`和`rename_axis`等方法,可以实现将特定行数据转置为新列,并自定义列名,从而优化数据分析和可视化。

数据重塑:将行级信息转换为列级展示

在数据分析实践中,我们经常会遇到需要将数据从“长格式”转换为“宽格式”的场景,即把某些具有分类属性的行数据转置为独立的列。一个典型的例子是,当一份报告的页面信息以多行形式存储时,我们可能希望将每个页面的数据作为单独的列来展示,以便于按报告整体进行分析。Pandas库提供了强大的工具来实现这种数据重塑,其中pivot函数是解决此类问题的核心。

原始数据结构示例

假设我们有一份包含公司年度报告页面级别信息的数据集。每行代表一个特定公司、年份和报告页码的某个值。

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
登录后复制

我们的目标是将每个报告页(Report Page)的Value1数据转置为独立的列,并以FIRM和YEAR作为唯一标识,最终得到类似Value1_Page1、Value1_Page2这样的新列。

使用 pandas.pivot 进行数据重塑

pandas.pivot 函数是实现这一目标的关键。它允许我们通过指定三个核心参数来重塑DataFrame:

  • index: 用于作为新DataFrame索引的一个或多个列名。
  • columns: 用于作为新DataFrame列名的一个或多个列名。
  • values: 用于填充新DataFrame值的列名。

结合上述参数,我们可以将Report Page列的值转换为新的列名,并将Value1列的值填充到这些新列中。

以下是实现所需转换的完整步骤及代码:

bee餐饮点餐外卖小程序
bee餐饮点餐外卖小程序

bee餐饮点餐外卖小程序是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷!功能演示:1、桌号管理登录后台,左侧菜单 “桌号管理”,添加并管理你的桌号信息,添加以后在列表你将可以看到 ID 和 密钥,这两个数据用来生成桌子的二维码2、生成桌子二维码例如上面的ID为 308,密钥为 d3PiIY,那么现在去左侧菜单微信设置

bee餐饮点餐外卖小程序 1
查看详情 bee餐饮点餐外卖小程序
# 1. 使用 pivot 函数进行数据重塑
#    - index: 保持 'FIRM' 和 'YEAR' 作为行标识
#    - columns: 将 'Report Page' 的值作为新的列名
#    - values: 'Value1' 列的值将填充到新创建的列中
df_pivoted = df.pivot(index=['FIRM', 'YEAR'], columns='Report Page', values='Value1')

# 2. 为新生成的列添加前缀
#    pivot操作后,新列名将是 'Report Page' 列的原始值 (例如 1, 2)。
#    使用 add_prefix('Value1_Page') 为这些列名添加统一的前缀,
#    使其更具描述性,如 'Value1_Page1', 'Value1_Page2'。
df_pivoted = df_pivoted.add_prefix('Value1_Page')

# 3. 重置索引
#    pivot操作会将 'FIRM' 和 'YEAR' 设置为DataFrame的索引。
#    使用 reset_index() 将它们转换回常规列。
df_pivoted = df_pivoted.reset_index()

# 4. 清理列轴名称 (可选但推荐)
#    reset_index() 可能会在列轴上留下一个名为 'Report Page' 的名称。
#    使用 rename_axis(None, axis=1) 可以移除这个名称,使DataFrame更整洁。
df_final = df_pivoted.rename_axis(None, axis=1)

print("\n重塑后的DataFrame:")
print(df_final)
登录后复制

输出结果:

重塑后的DataFrame:
  FIRM  YEAR  Value1_Page1  Value1_Page2
0    A  2012            10            15
1    B  2013            20            25
登录后复制

代码详解

  • df.pivot(index=['FIRM', 'YEAR'], columns='Report Page', values='Value1'):

    • index=['FIRM', 'YEAR']:指定了新的DataFrame的行索引将由FIRM和YEAR这两列的唯一组合构成。
    • columns='Report Page':指定了新的DataFrame的列名将由Report Page列中的唯一值构成。
    • values='Value1':指定了新DataFrame中每个单元格的值将取自原始DataFrame的Value1列。
    • 此步骤的直接结果是一个带有FIRM和YEAR作为多级索引,以及Report Page值作为列名(例如1和2)的DataFrame。
  • .add_prefix('Value1_Page'):

    • 在pivot操作之后,新生成的列名是Report Page列的原始值(例如 1, 2)。为了使列名更具描述性,我们使用add_prefix()方法为所有新列名添加'Value1_Page'前缀,将它们变为'Value1_Page1'和'Value1_Page2'。
  • .reset_index():

    • pivot操作会将index参数中指定的列(FIRM和YEAR)设置为DataFrame的索引。reset_index()方法的作用是将这些索引转换回常规的列。
  • .rename_axis(None, axis=1):

    • 在reset_index()之后,列轴本身可能会保留一个名称(在本例中可能是Report Page,因为它是columns参数的来源)。rename_axis(None, axis=1)用于移除这个列轴的名称,使DataFrame的结构更加简洁和标准。axis=1明确指定是对列轴进行操作。

注意事项

  1. 唯一性要求: pivot函数要求index和columns参数的组合必须是唯一的。如果存在重复的组合,Pandas将无法确定在特定行和列交叉点应该放置哪个值,并会抛出ValueError。在这种情况下,通常需要考虑使用pivot_table函数,它允许通过聚合函数(如mean、sum等)来处理重复值。
  2. 缺失值处理: 如果某些报告没有某个特定的页面(例如,公司A只有Page1而没有Page2),pivot函数会自动在对应的位置填充NaN(Not a Number),表示缺失数据。
  3. 多值列处理: 如果原始数据中有多个需要转置的值列,pivot函数也可以处理。只需将values参数传入一个列表,例如values=['Value1', 'Value2'],结果将是一个多级列索引的DataFrame。

通过上述步骤,我们可以灵活高效地将行级数据转换为列级展示,极大地提升了数据的可读性和分析效率。pandas.pivot是数据科学家和分析师在进行数据清洗和准备时不可或缺的强大工具。

以上就是如何使用Pandas将行数据转换为列数据的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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