
本教程详细介绍了如何使用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
这种转换使得我们可以更直观地比较不同股票在不同年份的特定财务指标,或者为后续的数据建模提供更规整的输入。
Pandas的DataFrame.pivot方法是实现这种转换的关键。它的基本语法是df.pivot(index, columns, values)。
在我们的场景中,Ticker应该作为新的行索引,Financial Ratio应该作为新的列的一部分。关键在于,年份(2001, 2002, 2003)本身就是我们要透视的值。因此,我们应该省略values参数。当values参数被省略时,pivot方法会将所有非index和columns指定的列都视为值列进行处理,这正是我们所需要的。
让我们通过一个示例来演示这个过程。首先,创建示例数据框:
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)通过掌握DataFrame.pivot方法的这一高级用法以及多级列索引的扁平化技巧,您可以高效地将复杂的多值列数据重塑为更适合分析和展示的宽格式数据。
以上就是使用Pandas水平透视多值列数据框的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号