Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Pandas DataFrame中基于键匹配与频率拆分数值的教程_创想鸟

Pandas DataFrame中基于键匹配与频率拆分数值的教程

Pandas DataFrame中基于键匹配与频率拆分数值的教程

本教程详细介绍了如何在Pandas DataFrame中,根据一个DataFrame(df1)中键的重复频率,将另一个DataFrame(df2)中的相关数值进行拆分并分配到df1的对应行中。核心方法是利用value_counts()计算键频率,然后通过div()进行标准化除法,最后使用merge()操作将处理后的数据合并,从而实现精确的数值分配。

1. 问题背景与目标

在数据处理中,我们经常会遇到需要将汇总数据(例如总销售额、总库存量)按某种比例或规则分配到其组成部分(例如单个销售记录、单个库存单位)的场景。本教程聚焦于一个具体问题:给定两个pandas dataframe,df1包含重复的键(例如产品id),df2包含每个唯一键对应的总数值。我们的目标是创建一个新的dataframe,其结构与df1相似,但df2中的数值已经被“拆分”并按键的出现频率分配到df1的对应行中。

例如,假设我们有以下两个DataFrame:

DataFrame 1 (df1): 包含重复的 id

id

ABACAAC

DataFrame 2 (df2): 包含每个唯一 id 对应的总数值

id Col1 Col2 Col3

A40010020B200800C600800

期望的输出结果:

id Col1 Col2 Col3

A100255B200800A100255C300400A100255A100255C300400

从期望结果可以看出,id为’A’的记录在df1中出现了4次,因此df2中’A’对应的Col1 (400) 被拆分为 400/4 = 100,Col2 (100) 被拆分为 100/4 = 25,Col3 (20) 被拆分为 20/4 = 5。同样,’C’出现了2次,其数值被拆分为一半。而’B’只出现1次,其数值保持不变。

2. 核心思路与实现步骤

要实现上述目标,我们需要执行以下几个关键步骤:

计算键频率: 统计df1中每个id出现的次数。标准化 df2: 将df2中每个id对应的数值除以其在df1中的出现频率。合并数据: 将标准化后的df2与原始df1进行合并。恢复索引: 确保最终输出的DataFrame具有与原始df1相同的索引结构。

我们将使用Pandas库中的value_counts()、div()和merge()函数来高效完成这些操作。

3. 示例代码与详细解析

首先,我们创建示例数据:

import pandas as pdimport numpy as np# 创建 DataFrame 1data1 = {'id': ['A', 'B', 'A', 'C', 'A', 'A', 'C']}df1 = pd.DataFrame(data1)# 创建 DataFrame 2data2 = {'id': ['A', 'B', 'C'],         'Col1': [400, 200, 600],         'Col2': [100, np.nan, 800],         'Col3': [20, 800, np.nan]}df2 = pd.DataFrame(data2)print("原始 df1:")print(df1)print("n原始 df2:")print(df2)

原始 df1:

  id0  A1  B2  A3  C4  A5  A6  C

原始 df2:

  id  Col1   Col2   Col30  A   400  100.0   20.01  B   200    NaN  800.02  C   600  800.0    NaN

现在,执行核心逻辑:

# 1. 计算 df1 中 'id' 列的频率id_counts = df1['id'].value_counts()print("nid 频率:")print(id_counts)# 2. 标准化 df2: 将 df2 中的数值除以对应的 id 频率#    - set_index('id') 将 'id' 设置为索引,以便与 id_counts 对齐#    - div(id_counts, axis=0) 对齐索引并执行逐行除法df2_standardized = df2.set_index('id').div(id_counts, axis=0)print("n标准化后的 df2:")print(df2_standardized)# 3. 合并数据#    - df1.reset_index() 暂时将 df1 的原始索引保存为一列,以便后续恢复#    - merge() 根据 'id' 列进行左连接 (how='left')#    - set_index('index').reindex(df1.index) 恢复原始索引和行顺序out = (df1.reset_index()          .merge(df2_standardized, on='id', how='left')          .set_index('index').reindex(df1.index)      )print("n最终输出:")print(out)

id 频率:

A    4C    2B    1Name: id, dtype: int64

标准化后的 df2:

    Col1   Col2   Col3id                     A  100.0   25.0    5.0B  200.0    NaN  800.0C  300.0  400.0    NaN

最终输出:

  id   Col1   Col2   Col30  A  100.0   25.0    5.01  B  200.0    NaN  800.02  A  100.0   25.0    5.03  C  300.0  400.0    NaN4  A  100.0   25.0    5.05  A  100.0   25.0    5.06  C  300.0  400.0    NaN

代码解析:

id_counts = df1[‘id’].value_counts():

这一步计算了df1中’id’列每个唯一值的出现频率。例如,’A’出现4次,’B’出现1次,’C’出现2次。结果是一个Pandas Series,索引是id值,值是频率。

df2_standardized = df2.set_index(‘id’).div(id_counts, axis=0):

df2.set_index(‘id’): 将df2的’id’列设置为其索引。这是为了让df2的行索引与id_counts的索引(即id值)对齐,以便进行正确的逐行除法。.div(id_counts, axis=0): 对df2中除id列以外的所有数值列执行除法操作。axis=0表示按行进行操作,Pandas会自动根据索引(即id值)将df2的每一行与id_counts中对应的频率值进行匹配并相除。如果df2中的某个单元格为NaN,除法操作会保留NaN。

out = (df1.reset_index().merge(df2_standardized, on=’id’, how=’left’).set_index(‘index’).reindex(df1.index)):

df1.reset_index(): 在合并之前,df1的原始整数索引(0, 1, 2…)很重要,因为我们希望最终输出的DataFrame具有与df1相同的行顺序和索引。reset_index()将当前索引转换为一个名为’index’的普通列,并生成一个新的默认整数索引。.merge(df2_standardized, on=’id’, how=’left’):将df1(现在包含原始索引作为’index’列)与df2_standardized进行合并。on=’id’ 指定了合并的键是’id’列。how=’left’ 执行左连接。这意味着df1中的所有行都会被保留,如果df1中的某个id在df2_standardized中没有匹配项(虽然在这个特定问题中不太可能),则对应的Col1, Col2, Col3会填充NaN。.set_index(‘index’): 合并完成后,我们将之前保存的’index’列重新设置回DataFrame的索引。.reindex(df1.index): 这一步是可选但推荐的,它确保最终DataFrame的行顺序和索引类型与原始df1完全一致。reindex会根据df1.index的顺序重新排列行,如果原始索引中有重复值,也会正确处理。

4. 注意事项与最佳实践

数据类型: 除法操作可能会导致数值列的数据类型从整数变为浮点数(例如int变为float),这是正常的。如果需要,可以使用astype()进行类型转换,但要注意NaN值可能导致无法转换为纯整数。NaN 值处理: df2中的NaN值在除法和合并过程中会保持为NaN。如果需要,可以在合并前后使用fillna()进行填充。性能: 对于非常大的DataFrame,merge操作可能会比较耗时。然而,Pandas的底层实现通常是高度优化的。此方法在大多数情况下都是高效且简洁的。键的唯一性: 确保df2中的’id’列是唯一的,否则set_index(‘id’)可能会引发错误或产生非预期的行为。如果df2中id不唯一,需要先对其进行聚合处理。索引管理: reset_index()和set_index().reindex()的组合是确保最终输出的索引和行顺序与原始df1保持一致的常用且稳健的方法。

5. 总结

本教程提供了一种高效且易于理解的Pandas解决方案,用于根据键的出现频率将一个DataFrame的数值拆分并分配到另一个DataFrame的对应行中。通过结合value_counts()计算频率、div()进行标准化以及merge()进行数据整合,我们能够精确地实现复杂的数值分配逻辑。掌握这种模式对于处理涉及数据聚合、拆分和重构的场景非常有用。

以上就是Pandas DataFrame中基于键匹配与频率拆分数值的教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1376807.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
python遍历列表的注意点
上一篇 2025年12月14日 16:13:33
解决Flask-SQLAlchemy的RuntimeError:配置时机是关键
下一篇 2025年12月14日 16:13:45

相关推荐

  • PHP 数组值比较与嵌套数组过滤教程

    本教程详细讲解如何在 PHP 中比较一个简单数组与一个复杂嵌套数组,并根据特定条件(如文件名匹配)过滤嵌套数组中的所有相关子数组。我们将通过识别非匹配项的索引,然后从所有子数组中移除这些项并重新索引,实现精确的数据筛选。 问题背景 在 php 开发中,我们经常会遇到需要处理结构复杂的数组数据。例如,…

    2026年9月21日
    100
  • Java集合框架在数据处理中的应用实例

    使用Set去重:通过LinkedHashSet去除标签重复并保持顺序;2. Map统计频次:利用HashMap统计单词出现次数;3. List结合Comparator排序:按年龄升序、姓名降序排列用户;4. 集合嵌套处理数据:用Map组织部门与员工列表。集合框架提升数据处理效率与代码可读性。 Jav…

    2026年9月21日
    000
  • MySQL性能模式监控资源_MySQL瓶颈定位精确工具

    MySQL性能模式监控资源_MySQL瓶颈定位精确工具MySQL性能模式监控资源_MySQL瓶颈定位精确工具MySQL性能模式监控资源_MySQL瓶颈定位精确工具MySQL性能模式监控资源_MySQL瓶颈定位精确工具

    mysql性能模式通过事件记录精准定位瓶颈,核心步骤包括:1.启用并配置performance schema,选择性开启消费者和仪器;2.监控等待事件、sql语句、阶段、i/o、内存及锁等关键指标;3.分析events_waits_summary_global_by_event_name等表识别资源…

    2026年9月21日 • 用户投稿
    000
  • REDMI有史以来最强手机!K90 Pro Max这次真的强到爆

    REDMI有史以来最强手机!K90 Pro Max这次真的强到爆REDMI有史以来最强手机!K90 Pro Max这次真的强到爆REDMI有史以来最强手机!K90 Pro Max这次真的强到爆REDMI有史以来最强手机!K90 Pro Max这次真的强到爆

    如果说redmi过去是“性价比之王”,那么这一次,它彻底进化成了“性能怪兽”。10月23日即将登场的redmi k90 pro max,不仅是品牌年度旗舰的压轴大戏,更是其历史上首款冠以“pro max”之名的巅峰之作。 这可以看作是REDMI向高端市场发起冲击的正式宣言。卢伟冰亲自放话:“给4K价…

    2026年9月21日 • 用户投稿
    300
  • vivo浏览器设置选项在哪里_vivo浏览器系统设置入口位置

    首先打开vivo浏览器,点击右上角三点图标进入设置菜单;也可通过首页滑动侧边栏或搜索框输入“设置”快速跳转,进而调整搜索引擎、隐私权限及清除缓存等配置。 如果您在使用vivo浏览器时需要调整浏览设置,例如更改默认搜索引擎、管理隐私权限或清除缓存数据,可以通过浏览器内置的系统设置入口进行操作。以下是进…

    2026年9月20日
    100
  • mac怎么合并多个PDF文件_Mac合并PDF文件方法

    使用macOS可便捷合并PDF:1. 用预览拖拽缩略图或插入文件;2. 通过访达快速操作批量合并;3. 借助在线工具如iLovePDF处理。 如果您需要将多个PDF文件整合为一个文档以便于分享或管理,macOS系统提供了多种便捷的合并方式。以下是一些有效的操作步骤: 本文运行环境:MacBook P…

    2026年9月20日
    000
  • order by排序在mysql中如何实现

    ORDER BY用于对查询结果排序,支持ASC升序和DESC降序,位于SELECT语句末尾,可按单列或多列排序;MySQL优先利用索引有序性避免排序,若无合适索引则采用filesort在内存或磁盘排序;优化器选择单路或双路排序以提升效率;性能关键包括为排序字段建立索引、避免大结果集无索引排序、减少S…

    2026年9月20日
    000
  • 在Java中如何实现多条件排序

    使用Comparator.thenComparing()可实现多条件排序,如先按年龄升序、再按分数降序、最后按姓名升序排列。 在Java中实现多条件排序,通常可以通过 Comparator 接口来完成。你可以根据多个字段依次比较,优先级从高到低排列。以下是几种常用且清晰的实现方式。 使用 Compa…

    2026年9月20日
    200
  • 企查查如何使用快捷查询栏_企查查查询栏的自定义配置教程

    首先启用快捷查询栏,再添加自定义模板如“高新技术企业_北京”,设置行业、地区等条件并保存,随后调整模板顺序以优化访问效率,最后可编辑或删除不再需要的查询配置。 如果您希望在企查查中快速查找企业信息,但每次手动输入查询条件较为繁琐,可以通过配置快捷查询栏来提升效率。通过自定义查询栏的显示字段和默认筛选…

    2026年9月20日
    000
  • 如何在Laravel中实现数据排序

    在laravel中实现数据排序的核心方法是使用eloquent查询构建器的orderby方法。1. 基础排序可通过orderby指定字段及方向,如按创建时间倒序排列;2. 可使用latest()和oldest()分别实现倒序和正序排列;3. 多字段排序通过链式调用多个orderby方法实现,如先按姓…

    2026年9月20日
    100
  • 蛙漫2(日版)(网页版)在线登录 蛙漫2(日版)入口通道

    蛙漫2(日版)在线登录入口为https://manwa2.com/,该平台汇集日漫、国漫等多类型高清漫画,涵盖校园、恋爱、冒险等题材,支持每日更新、智能推荐、夜间模式及书架同步等功能。 蛙漫2(日版)在线登录入口通道在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来蛙漫2(日版)最新网页版访…

    2026年9月20日
    100
  • Steam商店重磅更新上线!心动游戏发售不错过

    steam平台每日都有大量新游戏上线,这让玩家难以全面关注所有值得关注的作品。为解决这一难题,valve正推出一项全新功能——“个性化推荐日历”,目前该功能已通过steam labs实验项目进入测试阶段。 据Valve介绍,这项日历功能将根据每位用户的兴趣偏好和历史游玩行为,智能筛选并推荐可能感兴趣…

    2026年9月13日
    000
  • Linux如何统计目录大小du命令实例

    Linux如何统计目录大小du命令实例Linux如何统计目录大小du命令实例Linux如何统计目录大小du命令实例Linux如何统计目录大小du命令实例

    使用du命令可高效查看Linux目录大小,如du -s显示总占用空间,du -sh以易读格式展示,du -h列出各子目录大小,–max-depth限制层级深度,结合sort -h可排序定位最大目录。 在Linux系统中,du(disk usage)命令用于查看文件和目录的磁盘使用情况。统…

    2026年9月13日 • 用户投稿
    100
  • 索引如何提升mysql查询效率

    索引通过B+树结构改变数据查找方式,使MySQL无需全表扫描即可快速定位数据。有序存储、多层结构和高扇出性让查询效率大幅提升。例如在age字段建索引后,SELECT * FROM users WHERE age = 25可直接在B+树中查找,避免逐行比对。应为高频查询字段创建索引,优先使用复合索引并…

    2026年9月13日
    200
  • 悟空浏览器网页版主站链接 悟空浏览器官方网站进入

    悟空浏览器官网为https://www.wkbrowser.com,桌面端可直接访问完整版网页,移动端建议进入m.wkbrowser.com使用极简版本,支持多系统设备适配,提供安卓与iOS客户端下载,具备视频、图文、小说、短剧等内容的高效加载与播放功能,界面设计人性化,包含智能导航、历史检索、书签…

    2026年9月13日
    100
  • MySQL GROUP_CONCAT函数实现订单项按日期合并显示

    本教程详细阐述了如何利用MySQL的GROUP_CONCAT函数,将同一日期下的多个订单项合并为一行显示,并以逗号分隔。文章将涵盖从数据库查询优化到PHP数据处理的完整流程,旨在帮助开发者高效地在购物网站等场景中展示分组后的订单信息,提升数据可读性。 在构建在线购物平台时,展示客户订单详情是一个常见…

    2026年9月13日
    100
  • win11怎么查看并结束占用cpu高的进程_Win11CPU占用高进程查看与结束方法

    电脑运行慢或风扇狂转时,可通过任务管理器、资源监视器、命令提示符或PowerShell定位并结束高CPU占用进程。2. 按Ctrl+Shift+Esc打开任务管理器,按CPU排序找出异常进程,右键结束。3. 使用Win+R输入resmon打开资源监视器,查看CPU图表与详细列表,选中高占用进程后点击…

    2026年9月12日
    700
  • 猎豹浏览器官方网址最新入口 猎豹浏览器主页直达访问官方链接

    猎豹浏览器官方网址最新入口是https://www.liebao.cn/,该官网提供界面布局清晰、功能模块明确的主页直达访问,并支持智能搜索、一键清理缓存、网页翻译和夜间模式等核心功能。 猎豹浏览器官方网址最新入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来猎豹浏览器主页直达访问官方链…

    2026年9月12日
    200
  • QQ闪照打不开 QQ临时图片查看技巧

    答案是可通过查找手机缓存找回未查看的QQ闪照。进入tencent/MobileQQ/diskcache文件夹,按修改时间倒序排列,找到接近发送时间的无后缀乱码文件,用图片查看器打开并保存。 QQ闪照打不开,通常是因为发送方设置了查看时限或你错过了有效查看时间。虽然不能真正“解除限制”,但可以通过查找…

    2026年9月12日
    200
  • 打造移动声音标杆! REDMI K90 Pro Max评测:带低音炮的旗舰手机

    一、前言:被遗忘的旗舰音质赛道 如今的智能手机市场,各大厂商纷纷在影像系统、屏幕素质、处理器性能和充电速度上展开激烈竞争——然而,音频体验却仿佛成了无人问津的“冷门领域”。 可事实上,声音才是连接用户情感最直接的桥梁。无论是追剧时的环绕声场、听音乐时的细腻还原,还是游戏中精准的声音定位、通话时的清晰…

    2026年9月12日
    100

发表回复

登录后才能评论
关注微信