使用字典值有条件地划分 DataFrame 列

花韻仙語
发布: 2025-07-13 17:22:26
原创
475人浏览过

使用字典值有条件地划分 dataframe 列

本文介绍了如何根据 DataFrame 中某一列的值,以及一个字典的键值映射关系,有条件地更新 DataFrame 的另一列。当 DataFrame 列中的值存在于字典的键中时,执行除法操作;否则,保持原值不变。我们将探讨多种实现方法,并分析其优缺点,帮助你选择最适合自己场景的方案。

在数据分析和处理中,经常会遇到需要根据特定条件修改 DataFrame 列的情况。一个常见的场景是,我们有一个 DataFrame,其中包含需要调整的数值列和一个用于查找调整因子的 ID 列。同时,我们还有一个字典,将 ID 映射到对应的调整因子。目标是根据 ID 列的值,从字典中查找对应的调整因子,并将数值列除以该因子。如果 ID 在字典中不存在,则保持数值列不变。

以下我们将探讨几种实现此目标的方法。

方法 1: 使用 apply 函数

apply 函数可以按行或按列对 DataFrame 进行操作。我们可以使用 apply 函数,结合字典的 get 方法,实现有条件的除法操作。

import pandas as pd

df = pd.DataFrame({
  "integer_id": [1, 2, 3],
  "delta": [10, 20, 30]
})

d = {1: 0.5, 3: 0.25}

df['delta'] = df.apply(lambda r: r['delta']/d.get(r['integer_id'], 1), axis=1)

print(df)
登录后复制

这段代码首先定义了一个 DataFrame df 和一个字典 d。然后,使用 apply 函数遍历 DataFrame 的每一行。对于每一行,lambda 函数会获取 integer_id 列的值,并在字典 d 中查找对应的调整因子。d.get(r['integer_id'], 1) 的作用是:如果 r['integer_id'] 存在于字典 d 中,则返回对应的值;否则,返回默认值 1,从而保证 delta 列的值在 integer_id 不存在于字典中时保持不变。最后,将 delta 列除以调整因子,并将结果赋值回 delta 列。

方法 2: 使用 map 函数和 fillna 函数

map 函数可以将 Series 中的每个值映射到另一个值。我们可以使用 map 函数将 integer_id 列映射到字典 d 中的值,然后使用 fillna 函数处理缺失值。

import pandas as pd

df = pd.DataFrame({
  "integer_id": [1, 2, 3],
  "delta": [10, 20, 30]
})

d = {1: 0.5, 3: 0.25}

df["delta"] /= df.integer_id.map(d).fillna(1)

print(df)
登录后复制

这段代码首先使用 df.integer_id.map(d) 将 integer_id 列映射到字典 d 中的值。由于字典 d 中不存在 integer_id 为 2 的键,因此映射结果中对应的位置会是 NaN。然后,使用 fillna(1) 将 NaN 值替换为 1,从而保证 delta 列的值在 integer_id 不存在于字典中时保持不变。最后,将 delta 列除以映射结果。

方法 3: 使用 replace 函数和 where 函数

replace 函数可以替换 Series 中的值。where 函数可以根据条件选择 Series 中的值。我们可以使用 replace 函数将字典 d 中的键替换为对应的值,然后使用 where 函数根据条件选择是否执行除法操作。

import pandas as pd

df = pd.DataFrame({
  "integer_id": [1, 2, 3],
  "delta": [10, 20, 30]
})

d = {1: 0.5, 3: 0.25}

divisor = df['integer_id'].replace(d)
df['delta'] = df['delta'].where(df['integer_id'].isin(d.keys()), df['delta'] / divisor)

print(df)
登录后复制

这段代码首先使用 df['integer_id'].replace(d) 将 integer_id 列中存在于字典 d 的键替换为对应的值。然后,使用 df['delta'].where(df['integer_id'].isin(d.keys()), df['delta'] / divisor) 根据 integer_id 是否在字典 d 的键中选择是否执行除法操作。如果 integer_id 在字典 d 的键中,则执行除法操作;否则,保持原值不变。

总结与注意事项

以上三种方法都可以实现根据字典值有条件地划分 DataFrame 列的目标。选择哪种方法取决于具体的场景和个人偏好。

  • apply 函数的优点是代码简洁易懂,但性能相对较差,尤其是在处理大型 DataFrame 时。
  • map 函数和 fillna 函数的优点是性能较好,但代码相对复杂。
  • replace 函数和 where 函数的代码可读性较好,但是需要额外的变量来存储除数。

在实际应用中,可以根据 DataFrame 的大小和性能要求选择合适的方法。如果 DataFrame 较小,或者对性能要求不高,可以使用 apply 函数。如果 DataFrame 较大,并且对性能要求较高,可以使用 map 函数和 fillna 函数,或者replace 函数和 where 函数。

此外,需要注意的是,如果字典 d 中的值包含 0,则在执行除法操作时可能会出现 ZeroDivisionError 错误。为了避免这种情况,可以在执行除法操作之前,先检查字典 d 中的值是否为 0。

希望本教程能够帮助你理解如何根据字典值有条件地划分 DataFrame 列。

以上就是使用字典值有条件地划分 DataFrame 列的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号