
本教程详细介绍了如何使用Pandas库将多行、页级的数据结构转换为单行、列级汇总的格式。通过`pivot`函数,结合`add_prefix`、`reset_index`和`rename_axis`等方法,可以高效地将特定标识符下的重复行数据(如报告的每一页)转置为以页码为后缀的新列,从而实现数据维度的转换和聚合,便于后续分析。
在数据处理和分析中,我们经常会遇到需要将“长格式”数据(即同一实体的信息分散在多行中)转换为“宽格式”数据(即同一实体的信息聚合在一行中,通过新列来区分不同属性)的场景。一个典型的例子是,当一份报告的详细信息按页存储在不同的行中时,我们可能希望将这些页级信息转置为以报告为单位的单行数据,其中每页的内容对应一个独立的列。Pandas库提供了强大的工具来高效地完成这种数据重塑任务。
假设我们有一份关于公司年度报告的数据,其中包含了公司(FIRM)、年份(YEAR)、报告页码(Report Page)以及每页对应的某个值(Value1)。原始数据中,每份报告的每一页都占据独立的一行,如下所示:
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
我们的目标是将同一公司、同一年份下的不同页码的Value1值转置为新的列,并以“Value1_PageX”的形式命名,其中X代表页码。期望的输出格式如下:
FIRM YEAR Value1_Page1 Value1_Page2 0 A 2012 10 15 1 B 2013 20 25
Pandas的pivot函数是实现这种数据转置的核心工具。它根据指定的索引、列和值来重塑DataFrame。
pivot函数的主要参数包括:
在我们的案例中:
# 步骤1: 使用pivot函数进行基础重塑
pivoted_df = df.pivot(index=['FIRM', 'YEAR'], columns='Report Page', values='Value1')
print("\n经过pivot后的DataFrame:")
print(pivoted_df)此时的输出会是:
经过pivot后的DataFrame: Report Page 1 2 FIRM YEAR A 2012 10 15 B 2013 20 25
可以看到,FIRM和YEAR已经成为了新的索引,Report Page的唯一值(1和2)成为了新的列名,并且Value1的值填充到了相应的位置。
为了达到最终期望的输出格式,我们还需要进行以下几个步骤:
当前的列名只是页码(1, 2),我们希望它们是“Value1_Page1”、“Value1_Page2”。可以使用add_prefix()方法为所有列名添加前缀。
# 步骤2: 为列名添加前缀
df_with_prefix = pivoted_df.add_prefix('Value1_Page')
print("\n添加前缀后的DataFrame:")
print(df_with_prefix)输出结果:
添加前缀后的DataFrame:
Value1_Page1 Value1_Page2
FIRM YEAR
A 2012 10 15
B 2013 20 25此时,FIRM和YEAR仍然是DataFrame的索引。为了将它们变回普通的列,我们需要使用reset_index()方法。
# 步骤3: 重置索引
df_reset_index = df_with_prefix.reset_index()
print("\n重置索引后的DataFrame:")
print(df_reset_index)输出结果:
重置索引后的DataFrame: Report Page FIRM YEAR Value1_Page1 Value1_Page2 0 A 2012 10 15 1 B 2013 20 25
注意,此时Report Page作为一个额外的列名级别出现在最上方,这是pivot函数在创建多级列名时的一个副作用。
最后一步是移除这个多余的列索引名称Report Page。可以使用rename_axis(None, axis=1)来实现。
# 步骤4: 清理列索引名称
final_df = df_reset_index.rename_axis(None, axis=1)
print("\n最终结果DataFrame:")
print(final_df)最终输出结果:
最终结果DataFrame: FIRM YEAR Value1_Page1 Value1_Page2 0 A 2012 10 15 1 B 2013 20 25
这正是我们期望的输出。
将上述步骤整合到一起,完整的解决方案如下:
import pandas as pd
data = {
'FIRM': ['A', 'A', 'B', 'B', 'A'],
'YEAR': [2012, 2012, 2013, 2013, 2014],
'Report Page': [1, 2, 1, 2, 1],
'Value1': [10, 15, 20, 25, 30]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 使用pivot进行数据重塑,并链式调用后续操作
final_df = df.pivot(index=['FIRM', 'YEAR'],
columns='Report Page',
values='Value1') \
.add_prefix('Value1_Page') \
.reset_index() \
.rename_axis(None, axis=1)
print("\n最终转换后的DataFrame:")
print(final_df)输出:
原始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 4 A 2014 1 30 最终转换后的DataFrame: FIRM YEAR Value1_Page1 Value1_Page2 0 A 2012 10.0 15.0 1 A 2014 30.0 NaN 2 B 2013 20.0 25.0
通过本教程,我们学习了如何利用Pandas的pivot函数及其辅助方法(add_prefix、reset_index、rename_axis)将分散在多行中的页级数据高效地转置为列级数据。这种数据重塑技术在处理报告、日志或其他分层数据时非常有用,能够将数据转换为更易于分析和理解的宽格式。理解pivot的工作原理以及如何处理其输出,是Pandas数据处理能力的关键组成部分。
以上就是利用Pandas实现行数据转列:从多行报告页数据到单行汇总的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号