利用Pandas按字典映射聚合DataFrame列

碧海醫心
发布: 2025-11-07 14:04:01
原创
482人浏览过

利用pandas按字典映射聚合dataframe列

本文将详细介绍如何使用Pandas高效地根据一个字典来聚合DataFrame的列。该字典定义了新的列名及其对应的原始DataFrame列列表。我们将探讨两种Pythonic且高效的方法:一种利用`groupby(axis=1)`进行列分组求和,另一种则通过转置DataFrame来适应新版Pandas中`groupby`行为的变化,确保解决方案的兼容性和性能。

在数据分析和处理中,我们经常需要根据特定的规则对DataFrame的列进行组合或聚合。一个常见的场景是,我们有一个DataFrame和一份映射字典,字典的键是新的列名,值是需要聚合的原始DataFrame列名的列表。例如,如果字典中'x': ['A', 'D'],则新的DataFrame中的'x'列应该是原始DataFrame中'A'和'D'列的行级和。本教程将展示如何以Pandas的惯用方式(Pythonic)实现这一目标,避免使用低效的循环。

示例数据准备

首先,我们创建用于演示的DataFrame和映射字典:

import pandas as pd

df = pd.DataFrame([[4, 8, 52, 7, 54],
                   [0, 20, 2, 21, 35],
                   [2, 33, 12, 1, 87]],
                  columns=['A', 'B', 'C', 'D', 'E'])

dic = {'x': ['A', 'D'], 'y': ['E'], 'z': ['B', 'C']}

print("原始DataFrame:")
print(df)
print("\n映射字典:")
print(dic)
登录后复制

原始DataFrame df 如下:

   A   B   C   D   E
0  4   8  52   7  54
1  0  20   2  21  35
2  2  33  12   1  87
登录后复制

我们的目标是生成一个新DataFrame,其中包含 x, y, z 三列,分别对应 (A+D), (E), (B+C) 的行级和。

方法一:利用 rename 和 groupby(axis=1)

这种方法的核心思想是:首先创建一个“逆向”字典,将原始列名映射到它们应该归属的新列名。然后,利用 df.rename() 临时性地将DataFrame的列名修改为这些新的聚合组名。最后,通过 groupby(level=0, axis=1).sum() 对具有相同新列名的列进行分组求和。

  1. 创建逆向字典 d2: 这个字典将原始列名作为键,新的聚合列名作为值。 例如,'A' 应该映射到 'x','D' 也应该映射到 'x'。

    d2 = {v: k for k, l in dic.items() for v in l}
    print("\n逆向字典 d2:")
    print(d2)
    登录后复制

    输出 d2:

    聚好用AI
    聚好用AI

    可免费AI绘图、AI音乐、AI视频创作,聚集全球顶级AI,一站式创意平台

    聚好用AI 115
    查看详情 聚好用AI
    {'A': 'x', 'D': 'x', 'E': 'y', 'B': 'z', 'C': 'z'}
    登录后复制
  2. 重命名列并分组求和: 使用 df.rename(columns=d2) 将 df 的列名根据 d2 进行重命名。 例如,列 A 和 D 都会被重命名为 x。 然后,groupby(level=0, axis=1).sum() 会沿着列方向(axis=1)对具有相同名称的列进行分组,并计算它们的和。level=0 在这里是默认值,表示按列名本身进行分组。

    out_method1 = df.rename(columns=d2).groupby(level=0, axis=1).sum()
    print("\n方法一结果:")
    print(out_method1)
    登录后复制

    输出结果:

        x   y   z
    0  11  54  60
    1  21  35  22
    2   3  87  45
    登录后复制

    这里的 x 列是 A+D 的和 (4+7=11, 0+21=21, 2+1=3),y 列是 E 的值,z 列是 B+C 的和 (8+52=60, 20+2=22, 33+12=45)。

方法二:利用转置 (.T) 和 groupby (适用于新版Pandas)

在某些较新版本的Pandas中,直接在 groupby 中使用 axis=1 可能会被弃用。为了保持兼容性并提供另一种高效的解决方案,我们可以利用DataFrame的转置操作。

  1. 创建逆向字典 d2: 这一步与方法一相同,因为我们需要相同的映射关系。

    d2 = {v: k for k, l in dic.items() for v in l}
    登录后复制
  2. 转置、重命名、分组求和并再次转置:

    • df.T: 将DataFrame转置,原始列变为索引,原始索引变为列。
    • .rename(d2): 此时 d2 会作用于转置后DataFrame的索引(即原始的列名)。这样,原始列 A, D 对应的索引都会被重命名为 x。
    • .groupby(level=0).sum(): 对转置后DataFrame的索引(现在是新的聚合组名)进行分组求和。
    • .T: 再次转置,将结果恢复到原始的行/列布局。
    out_method2 = df.T.rename(d2).groupby(level=0).sum().T
    print("\n方法二结果:")
    print(out_method2)
    登录后复制

    输出结果与方法一相同:

        x   y   z
    0  11  54  60
    1  21  35  22
    2   3  87  45
    登录后复制

注意事项与总结

  • Pythonic与效率: 这两种方法都避免了显式循环,利用了Pandas底层的优化C/Cython实现,因此在大规模数据集上表现出更高的效率。
  • 灵活性: 这种模式非常灵活,不仅限于求和,还可以用于其他聚合操作(如 mean, max, min 等),只需将 .sum() 替换为相应的聚合函数即可。
  • 版本兼容性: 方法一在多数Pandas版本中都有效,但方法二提供了对未来版本更强的兼容性,以防 groupby(axis=1) 被完全弃用。建议在生产环境中使用方法二。
  • 字典理解: d2 = {v: k for k, l in dic.items() for v in l} 是一个高效且简洁的字典理解,用于反转和扁平化字典结构。

通过上述方法,我们可以优雅且高效地根据自定义的字典映射关系来聚合DataFrame的列,这在数据清洗、特征工程等场景中非常实用。掌握这些Pandas技巧将显著提升数据处理的效率和代码的可读性。

以上就是利用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号