0

0

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

聖光之護

聖光之護

发布时间:2025-11-01 10:12:27

|

668人浏览过

|

来源于php中文网

原创

使用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指定的列都视为值列进行处理,这正是我们所需要的。

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

CodeSquire
CodeSquire

AI代码编写助手,把你的想法变成代码

下载
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方法的这一高级用法以及多级列索引的扁平化技巧,您可以高效地将复杂的多值列数据重塑为更适合分析和展示的宽格式数据。

相关专题

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

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

49

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

216

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.11.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

250

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 1.8万人学习

时间管理,自律给我自由
时间管理,自律给我自由

共5课时 | 0.8万人学习

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

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