
本教程将指导如何在pandas dataframe中高效地将多列数据聚合为行级别的列表,并进一步利用`pivot`函数将特定列的值转换为新的列名,从而实现复杂的数据重塑。文章通过详细的代码示例和解析,展示了如何避免传统循环,以简洁且高性能的方式完成这一转换,适用于需要将宽格式数据转换为特定聚合透视结构的应用场景。
在数据分析和处理过程中,我们经常会遇到需要将DataFrame中的多列数据聚合到一行中的一个新列(例如列表),并在此基础上对数据进行重塑(透视)的需求。这种转换能够将宽格式数据转换为更适合特定分析或与其他数据合并的结构。本文将详细介绍如何利用Pandas库的强大功能,以高效且简洁的方式实现这一复杂的数据重塑。
假设我们有一个Pandas DataFrame,其中包含一个唯一标识符(id)、一个名称列(name)、多个数值列(value1, value2, value3)以及一个类型列(Type)。
原始DataFrame示例:
| id | name | value1 | value2 | value3 | Type |
|---|---|---|---|---|---|
| 1 | AAA | 1.0 | 1.5 | 1.8 | NEW |
| 2 | BBB | 2.0 | 2.3 | 2.5 | NEW |
| 3 | CCC | 3.0 | 3.6 | 3.7 | NEW |
我们的目标是将value1、value2、value3这几列的数据,针对每个name聚合为一个列表,并以name作为新的列名,Type作为索引(或普通列),形成一个新的DataFrame。
目标DataFrame示例:
| Type | AAA | BBB | CCC |
|---|---|---|---|
| NEW | [1.0, 1.5, 1.8] | [2.0, 2.3, 2.5] | [3.0, 3.6, 3.7] |
这种转换在需要将多个相关属性打包成一个集合,并按某个维度进行交叉分析时非常有用。
实现上述转换主要分为两个核心步骤:
我们将通过Pandas的链式操作来实现这一过程,避免使用低效的循环。
首先,我们需要选择value1到value3这些列,并将它们在每一行上转换为一个列表。Pandas的apply函数结合axis=1可以实现对行进行操作,而df.assign()则可以方便地添加新列而不修改原始DataFrame。
import pandas as pd
import io
# 示例数据
data = """id,name,value1,value2,value3,Type
1,AAA,1.0,1.5,1.8,NEW
2,BBB,2.0,2.3,2.5,NEW
3,CCC,3.0,3.6,3.7,NEW
"""
df = pd.read_csv(io.StringIO(data))
# 聚合多列为列表
df_with_list = df.assign(
value=df.loc[:, 'value1':'value3'].apply(list, axis=1)
)
print("步骤1:聚合后的DataFrame")
print(df_with_list)代码解析:
经过这一步,df_with_list DataFrame将新增一个value列,每行包含一个列表,例如:[1.0, 1.5, 1.8]。
有了包含列表的新列后,我们就可以使用pivot函数进行数据透视。pivot函数需要三个关键参数:
# 步骤2:数据透视
pivoted_df = df_with_list.pivot(
index='Type',
columns='name',
values='value'
)
print("\n步骤2:透视后的DataFrame(初步)")
print(pivoted_df)此时,pivoted_df的列索引可能包含name这个名称,为了使输出更简洁,我们可以使用rename_axis(None, axis=1)来移除列索引的名称。如果希望Type也作为一个普通列而不是索引,可以再调用reset_index()。
将上述两个步骤以及后续的清理操作链式组合起来,可以得到一个简洁高效的完整解决方案:
import pandas as pd
import io
# 示例数据
data = """id,name,value1,value2,value3,Type
1,AAA,1.0,1.5,1.8,NEW
2,BBB,2.0,2.3,2.5,NEW
3,CCC,3.0,3.6,3.7,NEW
"""
df = pd.read_csv(io.StringIO(data))
# 完整解决方案
transformed_df = (
df.assign(value=df.loc[:, 'value1':'value3'].apply(list, axis=1)) # 聚合多列为列表
.pivot(index='Type', columns='name', values='value') # 数据透视
.rename_axis(None, axis=1) # 清理列索引名称
.reset_index() # 将Type从索引转为普通列
)
print("\n最终转换结果:")
print(transformed_df)输出结果:
最终转换结果: Type AAA BBB CCC 0 NEW [1.0, 1.1, 1.2] [2.0, 2.1, 2.2] [3.0, 3.1, 3.2]
(注:输出示例中的值已根据问题中的原始数据进行了调整)
本文详细介绍了如何利用Pandas的assign、apply和pivot函数,将DataFrame中的多列数据高效地聚合为列表,并进行数据透视。这种方法不仅代码简洁,而且执行效率高,是处理复杂数据重塑任务的强大工具。掌握这些技巧,将有助于您更灵活、高效地进行数据分析和预处理。
以上就是Pandas DataFrame高效重塑:将多列聚合为列表并进行透视的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号