Pandas DataFrame高效重塑:将多列聚合为列表并进行透视

霞舞
发布: 2025-12-04 11:48:23
原创
391人浏览过

Pandas DataFrame高效重塑:将多列聚合为列表并进行透视

本教程将指导如何在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]

这种转换在需要将多个相关属性打包成一个集合,并按某个维度进行交叉分析时非常有用。

核心解决方案步骤

实现上述转换主要分为两个核心步骤:

  1. 聚合多列为列表: 将指定的多个数值列在行级别上合并为一个列表,并存储在一个新的列中。
  2. 数据透视: 利用新生成的列表列和name列进行数据透视,将name转换为列名。

我们将通过Pandas的链式操作来实现这一过程,避免使用低效的循环。

1. 聚合多列为列表

首先,我们需要选择value1到value3这些列,并将它们在每一行上转换为一个列表。Pandas的apply函数结合axis=1可以实现对行进行操作,而df.assign()则可以方便地添加新列而不修改原始DataFrame。

蚂蚁PPT
蚂蚁PPT

AI在线智能生成PPT

蚂蚁PPT 113
查看详情 蚂蚁PPT
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.loc[:, 'value1':'value3']: 选取从value1到value3(包含value3)的所有列。
  • .apply(list, axis=1): 对选定的这些列的每一行应用list函数。axis=1表示按行操作,将每一行的这些列的值打包成一个列表。
  • df.assign(value=...): 创建一个新的DataFrame,其中包含一个名为value的新列,其内容就是上一步生成的列表。

经过这一步,df_with_list DataFrame将新增一个value列,每行包含一个列表,例如:[1.0, 1.5, 1.8]。

2. 数据透视

有了包含列表的新列后,我们就可以使用pivot函数进行数据透视。pivot函数需要三个关键参数:

  • index: 用于构建新DataFrame的索引的列。在这里是Type。
  • columns: 用于构建新DataFrame的列名的列。在这里是name。
  • values: 用于填充新DataFrame的数据的列。在这里是新创建的value列。
# 步骤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]
登录后复制

(注:输出示例中的值已根据问题中的原始数据进行了调整)

注意事项与最佳实践

  1. 效率: 这种方法是高度矢量化的,避免了显式循环,因此对于大型数据集具有出色的性能。
  2. pivot与pivot_table:
    • df.pivot()要求index和columns的组合必须是唯一的。如果存在重复组合,它将抛出ValueError。在我们的例子中,Type和name的组合是唯一的(因为name在每个Type下是唯一的),所以pivot适用。
    • 如果index和columns的组合不唯一,并且需要聚合重复项,则应使用pd.pivot_table(),它提供了aggfunc参数来指定聚合函数(例如sum, mean, first等)。
  3. 动态列选择: 如果要聚合的value列名不是固定的,可以通过编程方式生成列名列表,例如value_cols = [f'value{i}' for i in range(1, 4)],然后将其用于df.loc[:, value_cols]。
  4. 错误处理: 在实际应用中,应考虑name列可能不唯一的情况。如果name不唯一,pivot操作将失败。在执行透视前,可以进行数据校验或预聚合。

总结

本文详细介绍了如何利用Pandas的assign、apply和pivot函数,将DataFrame中的多列数据高效地聚合为列表,并进行数据透视。这种方法不仅代码简洁,而且执行效率高,是处理复杂数据重塑任务的强大工具。掌握这些技巧,将有助于您更灵活、高效地进行数据分析和预处理。

以上就是Pandas DataFrame高效重塑:将多列聚合为列表并进行透视的详细内容,更多请关注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号