Pandas DataFrame中基于键匹配与计数的智能值分配教程

聖光之護
发布: 2025-10-10 12:29:42
原创
174人浏览过

Pandas DataFrame中基于键匹配与计数的智能值分配教程

本教程详细阐述了如何在Pandas中处理两个DataFrame,一个包含重复键,另一个包含唯一键及其关联数据。核心任务是将第二个DataFrame中的值根据第一个DataFrame中键的出现次数进行拆分并分配,最终生成一个合并后的新DataFrame。文章通过结合merge、value_counts和div等Pandas函数,提供了一种高效且结构化的解决方案,确保数据按比例正确分配,并详细解释了实现步骤与代码细节。

问题概述

在数据分析和处理中,我们经常会遇到需要整合来自不同数据源的信息。一个常见场景是,我们有两个dataframe:

  • DataFrame 1 (DF_1): 包含一个或多个键列,其中键值可能重复出现,代表了需要分配数据的记录。
  • DataFrame 2 (DF_2): 包含与DF_1中键对应的唯一键值,以及与这些键关联的详细数据列。

我们的目标是创建一个新的DataFrame,它基于DF_1的结构,但DF_2中的数值列已根据DF_1中对应键的出现次数进行了“拆分”或“分配”。例如,如果DF_2中键'A'的值是100,而DF_1中'A'出现了4次,那么在最终结果中,每个'A'对应的数值应为25 (100 / 4)。

核心思路与Pandas函数

解决此类问题的关键在于以下几个Pandas操作的组合:

  1. 计数键的频率 (value_counts()): 首先,我们需要知道DF_1中每个键出现了多少次。Series.value_counts()函数能够高效地完成这项任务。
  2. 按频率拆分/标准化值 (div()): 得到每个键的频率后,我们可以使用DataFrame.div()函数将DF_2中对应键的数值列除以其在DF_1中的出现频率。这实现了值的按比例拆分。
  3. 合并数据 (merge()): 最后,将经过标准化处理的DF_2与原始的DF_1根据键列进行合并,以生成最终结果。

示例数据准备

为了更好地说明,我们使用以下示例数据来模拟问题场景:

import pandas as pd
import numpy as np

# DataFrame 1 (DF_1): 包含重复键
data1 = {'id': ['A', 'B', 'A', 'C', 'A', 'A', 'C']}
df1 = pd.DataFrame(data1)
print("DF_1:")
print(df1)

# DataFrame 2 (DF_2): 包含唯一键和数据值
data2 = {'id': ['A', 'B', 'C'],
         'Col1': [400, 200, 600],
         'Col2': [100, np.nan, 800],
         'Col3': [20, 800, np.nan]}
df2 = pd.DataFrame(data2)
print("\nDF_2:")
print(df2)
登录后复制

DF_1:

  id
0  A
1  B
2  A
3  C
4  A
5  A
6  C
登录后复制

DF_2:

  id  Col1   Col2   Col3
0  A   400  100.0   20.0
1  B   200    NaN  800.0
2  C   600  800.0    NaN
登录后复制

实现步骤与代码示例

以下是实现所需功能的Pandas代码:

out = (df1.reset_index() # 1. 重置df1的索引,将原索引保存为'index'列
          .merge(df2.set_index('id') # 2. 将df2的'id'列设为索引
                    .div(df1['id'].value_counts(), axis=0), # 3. 计算df1中'id'的频率并用其除df2的数据列
                 on='id', # 4. 根据'id'列进行左合并
                 how='left')
          .set_index('index').reindex(df1.index) # 5. 恢复原始df1的索引和顺序
      )
print("\nOutput DataFrame:")
print(out)
登录后复制

输出结果:

  id   Col1   Col2   Col3
0  A  100.0   25.0    5.0
1  B  200.0    NaN  800.0
2  A  100.0   25.0    5.0
3  C  300.0  400.0    NaN
4  A  100.0   25.0    5.0
5  A  100.0   25.0    5.0
6  C  300.0  400.0    NaN
登录后复制

代码详解

让我们逐行分析上述解决方案:

琅琅配音
琅琅配音

全能AI配音神器

琅琅配音 208
查看详情 琅琅配音
  1. df1.reset_index():

    • 这一步是为了在合并操作中保留DF_1的原始行顺序。reset_index()会将当前的DataFrame索引转换为一个普通列(默认命名为'index'),并为DataFrame设置一个新的默认整数索引。这样做可以确保在后续合并后,我们能通过这个保存下来的'index'列重新恢复DF_1的原始顺序。
  2. df2.set_index('id'):

    • 将DF_2的'id'列设置为其索引。这样做是为了方便后续的除法操作。当Series(来自value_counts()的结果)与DataFrame进行除法运算时,Pandas会尝试根据索引进行对齐。
  3. .div(df1['id'].value_counts(), axis=0):

    • df1['id'].value_counts(): 计算DF_1中每个'id'键出现的次数。例如,对于我们的示例数据,结果可能是 A: 4, B: 1, C: 2。这个结果是一个Series,其索引是'id'值。
    • .div(..., axis=0): 对df2.set_index('id')后的DataFrame进行除法操作。axis=0表示按行进行操作,Pandas会根据DataFrame的索引(此时是'id')与value_counts()结果的索引进行匹配。这样,DF_2中每个'id'对应的所有数值列都会被其在DF_1中的出现频率所除。例如,对于'A',Col1的400会被4除,Col2的100会被4除,以此类推。
  4. .merge(..., on='id', how='left'):

    • 将处理后的DF_2(现在其值为已拆分的)与df1.reset_index()的结果进行合并。
    • on='id': 指定合并的键是'id'列。
    • how='left': 执行左合并。这意味着合并结果将包含df1.reset_index()中的所有行,并根据'id'匹配从处理后的DF_2中引入相应的拆分值。由于DF_1中的'id'是重复的,合并后会生成多行,每行对应DF_1中的一个原始记录。
  5. .set_index('index').reindex(df1.index):

    • .set_index('index'): 在合并结果中,将之前保存的原始索引列'index'重新设为DataFrame的索引。
    • .reindex(df1.index): 这一步是确保最终DataFrame的行顺序与原始DF_1的行顺序完全一致。reindex()会根据df1.index(即原始DF_1的索引)重新排列行。

注意事项

  • 数据类型转换: 由于进行了除法运算,结果DataFrame中的数值列的数据类型可能会从整数变为浮点数(float)。这在大多数情况下是期望的,但如果需要整数结果,可能需要进行额外的类型转换(例如,使用astype(int),但要处理NaN值)。
  • 缺失值 (NaN) 处理: 如果DF_2中的某些数值列本身就包含NaN,或者在除法操作后,某个键在DF_2中对应的列值为空,结果中也会保留NaN。例如,Col2在B行是NaN,Col3在C行是NaN,这些都会在最终输出中体现。
  • 键的完整性: 确保DF_1中的所有键都能在DF_2中找到匹配。如果DF_1中存在DF_2中没有的键,left merge会为这些键引入NaN值。反之,如果DF_2中存在DF_1中没有的键,这些键及其拆分后的值将不会出现在最终结果中。
  • 性能考量: 对于非常大的DataFrame,这种链式操作通常是高效的。Pandas底层使用优化的C语言实现,能够处理大量数据。然而,对于极大数据集,内存使用和计算时间仍需注意。

总结

通过巧妙地结合value_counts()、div()和merge()这三个核心Pandas函数,我们可以高效且精确地实现基于键匹配与计数的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号