使用Pandas水平透视多值列数据框的教程

聖光之護
发布: 2025-11-01 10:12:27
原创
649人浏览过

使用Pandas水平透视多值列数据框的教程

本教程详细介绍了如何使用pandas库对包含多个数值列的数据框进行水平透视转换。通过`dataframe.pivot`方法,并巧妙地处理其`values`参数,可以将原始数据从“长格式”转换为“宽格式”,实现按指定索引和列进行重塑,同时将年份和财务比率信息合并到新的列名中,从而提高数据分析的便利性和可读性。

在数据分析和处理中,经常需要对数据框进行重塑(Reshape)操作,其中一种常见需求是将“长格式”数据转换为“宽格式”数据。特别是当数据中包含多个作为值(value)的列,并且希望将其中一个分类列(如“财务比率”)与这些值列(如“年份”)结合起来形成新的列标题时,Pandas的pivot方法提供了一个强大而灵活的解决方案。

理解数据重塑需求

假设我们有以下格式的财务数据,其中Ticker代表股票代码,Financial Ratio代表具体的财务指标,而2001、2002、2003等代表不同年份的数值:

  Ticker  Financial Ratio                  2001     2002    2003    
  ARKR    Net Profit Margin                -0.1931  0.052   -0.0187
  ARKR    Return on Assets                 0        0       0
  ARKR    Current Ratio                    1.3419     1.2096  0.7031
  ARMK    Net Profit Margin                -0.1931  0.052   -0.0187
  ARMK    Return on Assets                 0        0       0
  ARMK    Current Ratio                    1.3419     1.2096  0.7031
登录后复制

我们的目标是将数据重塑为以下形式,其中Ticker作为唯一的行索引,而年份和财务比率组合成新的列名(例如“2001 Net Profit Margin”):

  Ticker  2001 Net Profit Margin  2001 Return on Assets  2001 Current Ratio  2002 Net Profit Margin...
  ARKR    -0.1931                 0                      1.3419              0.052  
  ARMK    -0.1931                 0                      1.3419              0.052 
登录后复制

这种转换使得我们可以更直观地比较不同股票在不同年份的特定财务指标,或者为后续的数据建模提供更规整的输入。

使用 DataFrame.pivot 进行水平透视

Pandas的DataFrame.pivot方法是实现这种转换的关键。它的基本语法是df.pivot(index, columns, values)。

  • index: 用于生成新数据框的行索引的列。
  • columns: 用于生成新数据框的列索引的列。
  • values: 可选参数,用于填充新数据框的值的列。如果省略此参数,则所有未用于index或columns的列都将作为值列。

在我们的场景中,Ticker应该作为新的行索引,Financial Ratio应该作为新的列的一部分。关键在于,年份(2001, 2002, 2003)本身就是我们要透视的值。因此,我们应该省略values参数。当values参数被省略时,pivot方法会将所有非index和columns指定的列都视为值列进行处理,这正是我们所需要的。

让我们通过一个示例来演示这个过程。首先,创建示例数据框:

序列猴子开放平台
序列猴子开放平台

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

序列猴子开放平台 0
查看详情 序列猴子开放平台
import pandas as pd
import io

# 模拟原始数据
data = """
Ticker,Financial Ratio,2001,2002,2003
ARKR,Net Profit Margin,-0.1931,0.052,-0.0187
ARKR,Return on Assets,0,0,0
ARKR,Current Ratio,1.3419,1.2096,0.7031
ARMK,Net Profit Margin,-0.1931,0.052,-0.0187
ARMK,Return on Assets,0,0,0
ARMK,Current Ratio,1.3419,1.2096,0.7031
"""
df = pd.read_csv(io.StringIO(data))
print("原始数据框:")
print(df)

# 执行透视操作
# 注意:这里省略了 values 参数
pivoted_df = df.pivot(index="Ticker", columns="Financial Ratio")
print("\n初步透视结果(列为MultiIndex):")
print(pivoted_df)
登录后复制

运行上述代码,你会发现pivoted_df的列是一个MultiIndex,其中第一层是年份(2001, 2002, 2003),第二层是财务比率(Current Ratio, Net Profit Margin, Return on Assets)。

初步透视结果(列为MultiIndex):
Financial Ratio Current Ratio Net Profit Margin Return on Assets Current Ratio Net Profit Margin Return on Assets Current Ratio Net Profit Margin Return on Assets
Ticker                                                                                                                                                            
ARKR                   1.3419           -0.1931                0.0      1.2096                   0.052                0.0      0.7031                 -0.0187                0.0
ARMK                   1.3419           -0.1931                0.0      1.2096                   0.052                0.0      0.7031                 -0.0187                0.0
登录后复制

扁平化多级列索引

为了达到我们最终的目标格式,我们需要将这个多级列索引扁平化为单一的、描述性更强的列名,例如“2001 Net Profit Margin”。这可以通过列表推导式和f-string(格式化字符串字面量)高效完成。

# 扁平化列名
# pivoted_df.columns 是一个MultiIndex,包含 (年份, 财务比率) 的元组
# 我们可以遍历这些元组,将它们组合成新的字符串
pivoted_df.columns = [f"{year} {ratio}" for year, ratio in pivoted_df.columns]

# 重置索引,将 'Ticker' 从索引变为普通列
final_df = pivoted_df.reset_index()

print("\n最终转换结果:")
print(final_df)
登录后复制

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

最终转换结果:
  Ticker  2001 Current Ratio  2001 Net Profit Margin  2001 Return on Assets  2002 Current Ratio  2002 Net Profit Margin  2002 Return on Assets  2003 Current Ratio  2003 Net Profit Margin  2003 Return on Assets
0   ARKR              1.3419                 -0.1931                    0.0              1.2096                   0.052                    0.0              0.7031                 -0.0187                    0.0
1   ARMK              1.3419                 -0.1931                    0.0              1.2096                   0.052                    0.0              0.7031                 -0.0187                    0.0
登录后复制

完整代码示例

将上述步骤整合,完整的解决方案如下:

import pandas as pd
import io

# 模拟原始数据加载
data = """
Ticker,Financial Ratio,2001,2002,2003
ARKR,Net Profit Margin,-0.1931,0.052,-0.0187
ARKR,Return on Assets,0,0,0
ARKR,Current Ratio,1.3419,1.2096,0.7031
ARMK,Net Profit Margin,-0.1931,0.052,-0.0187
ARMK,Return on Assets,0,0,0
ARMK,Current Ratio,1.3419,1.2096,0.7031
"""
df = pd.read_csv(io.StringIO(data))

# 1. 使用 pivot 方法进行透视,省略 values 参数
# Ticker 作为新的行索引
# Financial Ratio 作为新的列层级
# 2001, 2002, 2003 自动作为值列
pivoted_df = df.pivot(index="Ticker", columns="Financial Ratio")

# 2. 扁平化多级列索引
# 将 (年份, 财务比率) 组合成 "年份 财务比率" 格式的字符串
pivoted_df.columns = [f"{year} {ratio}" for year, ratio in pivoted_df.columns]

# 3. 重置索引,将 Ticker 从索引变回普通列
final_df = pivoted_df.reset_index()

print(final_df)
登录后复制

注意事项与总结

  1. DataFrame.pivot与DataFrame.pivot_table的区别
    • pivot方法要求index和columns的组合必须是唯一的,即不能有重复的组合。如果存在重复,pivot会抛出错误。
    • pivot_table方法则允许存在重复,并通过aggfunc参数指定聚合函数(如mean, sum, count等)来处理重复值。在本例中,由于每个Ticker和Financial Ratio组合在每个年份下只有一个值,所以pivot是适用的。
  2. values参数的省略:本教程的核心在于,当数据框中存在多个列都应作为透视后的值时,可以省略pivot方法的values参数。Pandas会自动将所有未被index和columns指定的列作为值进行处理,并生成一个MultiIndex列。
  3. 列名扁平化:生成MultiIndex列后,通常需要对其进行扁平化处理,使其更易读和操作。列表推导式结合f-string是实现这一目标的简洁有效方式。
  4. 数据类型:确保参与透视的列(尤其是index和columns)的数据类型是合适的。年份列在此处是数值,但在实际操作中,它们作为列名时会被视为字符串。

通过掌握DataFrame.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号