使用 Pandas 根据字典映射聚合 DataFrame 列


使用 pandas 根据字典映射聚合 dataframe 列

本文详细介绍了如何利用 Pandas 库高效地根据一个字典来聚合 DataFrame 中的列。通过将原始列名映射到新的分组键,并结合 `rename` 和 `groupby.sum` 方法,或者在较新版本 Pandas 中采用转置 (`.T`) 的策略,我们可以实现将多个指定列按行求和并创建新列的需求,避免了传统循环的低效,提升了代码的简洁性和执行效率。

在数据处理中,我们经常会遇到需要将 DataFrame 中的多列按照某种规则进行聚合,生成新的列。例如,给定一个 DataFrame 和一个字典,该字典的键代表新的列名,值则是一个包含现有列名的列表,表示这些现有列需要按行求和以构成新的列。传统上,这可能通过循环实现,但在 Pandas 中,有更“Pythonic”且高效的向量化方法。

场景描述与初始数据准备

假设我们有一个 Pandas 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:
   A   B   C   D   E
0  4   8  52   7  54
1  0  20   2  21  35
2  2  33  12   1  87

聚合字典:
{'x': ['A', 'D'], 'y': ['E'], 'z': ['B', 'C']}

我们的目标是创建一个新的 DataFrame,其中包含 'x', 'y', 'z' 三列。列 'x' 的值是原始 DataFrame 中 'A' 和 'D' 列的按行和;列 'y' 是 'E' 列的值;列 'z' 是 'B' 和 'C' 列的按行和。

解决方案一:利用 rename 和 groupby.sum

这种方法的核心思想是:首先创建一个反向映射字典,将原始列名映射到它们所属的新分组名。然后,利用 df.rename(columns=d2) 临时“重命名”列,使得属于同一分组的列拥有相同的名称。最后,使用 groupby(level=0, axis=1).sum() 对这些具有相同名称的列进行按行求和。

ViiTor AI ViiTor AI

一个强大的多语言AI语音合成和视频转译平台

ViiTor AI 9414 查看详情 ViiTor AI
  1. 创建反向映射字典 d2: 这个字典将原始 DataFrame 的每个列名(如 'A', 'D')映射到其在结果 DataFrame 中对应的列名(如 'x')。

    d2 = {v:k for k,l in dic.items() for v in l}
    print("\n反向映射字典:")
    print(d2)

    输出:

    反向映射字典:
    {'A': 'x', 'D': 'x', 'E': 'y', 'B': 'z', 'C': 'z'}
  2. 重命名列并进行分组求和:df.rename(columns=d2) 会将 DataFrame 的列名根据 d2 进行转换。例如,'A' 和 'D' 都会被临时命名为 'x'。 groupby(level=0, axis=1).sum() 的作用是:

    • axis=1 表示按列进行分组操作。
    • level=0 在这里指的是列名本身。由于重命名后,属于同一分组的列现在具有相同的名称,groupby 会将它们视为一个组。
    • .sum() 则对每个组内的列进行求和,由于 axis=1,这实际上是按行求和。
    out = df.rename(columns=d2).groupby(level=0, axis=1).sum()
    print("\n解决方案一结果:")
    print(out)

    输出:

    解决方案一结果:
        x   y   z
    0  11  54  60
    1  21  35  22
    2   3  87  45

解决方案二:利用转置 (.T) 处理(适用于较新 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 会作用于转置后的索引(即原来的列名)。
    • .groupby(level=0).sum():在转置后的 DataFrame 上,level=0 指的是当前的行索引。具有相同索引值的行(即原 DataFrame中属于同一分组的列)会被聚合求和。
    • .T:最后再次转置,将结果恢复到我们期望的列式结构。
    out_transposed = df.T.rename(d2).groupby(level=0).sum().T
    print("\n解决方案二(转置)结果:")
    print(out_transposed)

    输出:

    解决方案二(转置)结果:
        x   y   z
    0  11  54  60
    1  21  35  22
    2   3  87  45

总结与注意事项

  • Pythonic 与效率: 这两种方法都充分利用了 Pandas 的向量化操作,避免了显式的 Python 循环,因此在处理大规模数据时具有显著的性能优势。它们比手动迭代 DataFrame 的行和列要高效得多。
  • 灵活性: 这种方法非常灵活,只要能够构建出正确的映射字典,就可以根据任意复杂的列分组规则进行聚合。
  • groupby(level=0, axis=1) 的理解: level=0 在这里指的是 DataFrame 的列索引的第一个(也是唯一一个)级别。当列名被 rename 映射后,具有相同映射值的列在 groupby 时会被视为一个组。
  • 转置方法的适用性: 当遇到 groupby 在 axis=1 上的使用被提示弃用时,转置方法是一个很好的替代方案,它在功能上完全等价。
  • 错误处理: 在实际应用中,需要确保 dic 中引用的所有列名都存在于 df 中,否则 rename 操作可能会导致错误或意外行为。

通过掌握这些 Pandas 技巧,您可以更高效、更简洁地完成 DataFrame 列的聚合任务,从而提升数据处理的效率和代码的可维护性。

以上就是使用 Pandas 根据字典映射聚合 DataFrame 列的详细内容,更多请关注其它相关文章!


# 其中包含  # 网络营销就是seo.  # 网站灰色推广  # 怎么在外国推广我的网站  # seo课程图片  # 高淳区短视频seo  # 信息化关键词排名效果  # 百度营销后台推广登陆  # 昭通关键词排名优化方案  # 视频如何做营销推广  # 华山街道seo网站推广  # python  # 是一个  # 创建一个  # 会将  # 数据处理  # 几种  # 浮点  # 在这里  # 指的是  # 重命名 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 汽水音乐网页端访问 汽水音乐官方网页直达  Python定时发送QQ消息  C++ priority_queue怎么用_C++优先队列底层实现与自定义比较器  解决Pandas DataFrame高度碎片化警告:高效创建多列的策略  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  申通快递查询 申通物流快递单实时查询入口  TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  CSS动画如何实现图标旋转并放大_transform rotate scale @keyframes实现  《王者荣耀世界》英雄获取攻略  易车网官网直达入口 易车网在线登录入口  Go语言反射机制:如何访问被嵌入结构体遮蔽的方法  房产|直播|视频号怎么认证开通?|直播|需要什么资质?  Dagster资产间数据传递与用户配置管理教程  Golang如何实现HTTP请求重试机制_Golang HTTP请求错误处理策略  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  阿里云共享相册入口在哪  Win10截图远程协助 Win10远程桌面截屏法【场景应用】  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践  《单词速记宝》设置学习计划方法  荣耀magicv5怎么上手测评  百度识图图像分析 百度识图识别平台  《火花chat》搜索好友方法  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  如何通过settings.json个性化您的VS Code体验  毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明  谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  小红书网页版首页入口 小红书网页版电脑端官方登录链接  PSD转AI文件的简单方法  解决CSS background 属性中 cover 关键字的常见误用  菜鸟驿站的取件码忘了怎么办 手机快速查询指南  微信网页版在线登录 微信网页版在线使用入口  Go语言中方法与接收器:指针和值类型的调用机制详解  口腔诊所管理软件推荐  4399正版网页版入口高清直达链接  Win11便笺在哪打开 Win11桌面便笺(Sticky Notes)使用方法【详解】  睡觉时心跳快是什么原因 夜间心悸如何应对  《广发易淘金》国债逆回购操作教程  抖音号升级企业号怎么改名字?升级企业号有哪些好处?  有道AI翻译入口 智能写作官方网站入口  C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用  一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化  AO3中文版手机快速通道_AO3最新稳定链接更新  Apple Music无故扣费引质疑  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办? 

 2025-11-04

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.