使用 Pandas 查找每个 Code 对应的 Rank 最小的 Smth

碧海醫心
发布: 2025-10-31 12:33:27
原创
497人浏览过

使用 pandas 查找每个 code 对应的 rank 最小的 smth

本文介绍了如何使用 Pandas 处理两个 DataFrame,根据 df1 的 'code' 列,在 df1 的 'smth' 列中查找 df2 中 'rank' 最小的 'smth' 值,并将结果输出到一个新的 DataFrame 中。文章提供了详细的代码示例,并解释了关键步骤,帮助读者理解和应用 Pandas 进行数据处理和分析。

在数据分析任务中,经常会遇到需要根据多个 DataFrame 的信息进行筛选和聚合的情况。本文将介绍如何使用 Pandas 解决一个具体的问题:给定两个 DataFrame,df1 和 df2,目标是对于 df1 中每个 'code',找到在 df1 的 'smth' 列中,对应于 df2 中 'rank' 最小的 'smth' 值,并将包含该 'smth' 值的 df1 行提取出来。

数据准备

首先,我们需要创建示例 DataFrame。以下代码创建了 df1 和 df2,模拟了实际数据场景。

import pandas as pd

data1 = {'smth': ['RB', 'Supp', 'DX RT', 'Fk', 'CZFO', 'Supp_t', 'RK', 'rec', 'commerc', 'Supp_t'], 
         'code': ['HC-1343958', 'HC-1343958', 'HC-1340305', 'HC-1340305', 'HC-1107001', 'HC-1107001', 'HC-1107001', 'HC-1135154', 'HC-1135154', 'HC-1135154'], 
         'product_name': ['ERXY3-400', 'ERXY3-400', 'BWH/S 100 Level PRO', 'BWH/S 100 Level PRO', 'GWH 12 Fonte', 'GWH 12 Fonte', 'GWH 12 Fonte', 'BEC/ETER-1500', 'BEC/ETER-1503', 'BEC/ETER-1505'], 
         'digit': [3, 2, 20, 1, 1, 17, 78, 246, 10, 23], 
         'changes': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
data2 = {'smth': ['rec', 'Supp', 'Supp_t', 'RK', 'CZFO', 'RB'], 'rank': [2, 4, 6, 8, 9, 10]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

print("df1:")
print(df1)
print("\ndf2:")
print(df2)
登录后复制

解决方案

为了解决这个问题,可以采用以下步骤:

AppMall应用商店
AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店56
查看详情 AppMall应用商店
  1. 创建映射关系: 将 df2 转换为一个字典,其中 'smth' 作为键,'rank' 作为值。
  2. 映射 'rank' 值: 使用 df1['smth'].map(m) 将 df1 的 'smth' 列映射为对应的 'rank' 值。
  3. 分组并找到最小值: 使用 groupby(df1['code']).idxmin() 根据 'code' 列进行分组,并找到每个组中 'rank' 值最小的索引。
  4. 布尔索引: 使用 df1.index.isin(idxmin) 创建一个布尔索引,用于选择 df1 中 'rank' 最小的行。

以下是完整的代码实现:

m = dict(df2.values) # 将 df2 转换为字典
idxmin = df1['smth'].map(m).groupby(df1['code']).idxmin() # 映射 rank 值并分组找到最小值索引
out = df1[df1.index.isin(idxmin)] # 使用布尔索引选择结果

print("\nResult DataFrame:")
print(out)
登录后复制

这段代码首先将 df2 转换为一个字典 m,方便后续查找 'smth' 对应的 'rank' 值。然后,使用 df1['smth'].map(m) 将 df1 的 'smth' 列映射为对应的 'rank' 值。接着,使用 groupby(df1['code']).idxmin() 根据 'code' 列进行分组,并找到每个组中 'rank' 值最小的索引。最后,使用 df1.index.isin(idxmin) 创建一个布尔索引,用于选择 df1 中 'rank' 最小的行,并将结果存储在 out DataFrame 中。

代码解释

  • m = dict(df2.values): 这行代码将 df2 转换为一个字典。df2.values 返回一个包含 DataFrame 值的 NumPy 数组,然后 dict() 函数将其转换为字典。例如,df2 转换为 {'rec': 2, 'Supp': 4, 'Supp_t': 6, 'RK': 8, 'CZFO': 9, 'RB': 10}。
  • df1['smth'].map(m): 这行代码使用 map() 函数将 df1 的 'smth' 列中的每个值映射到字典 m 中对应的值。如果 'smth' 列中的值在字典 m 中不存在,则映射结果为 NaN。
  • groupby(df1['code']).idxmin(): 这行代码首先使用 groupby(df1['code']) 根据 df1 的 'code' 列对 df1['smth'].map(m) 的结果进行分组。然后,对于每个分组,idxmin() 函数返回 'rank' 值最小的索引。
  • df1[df1.index.isin(idxmin)]: 这行代码使用布尔索引来选择 df1 中 'rank' 最小的行。df1.index.isin(idxmin) 返回一个布尔数组,其中 True 表示 df1 的索引在 idxmin 中,False 表示不在。然后,将此布尔数组用作 df1 的索引,以选择对应的行。

总结

本文介绍了如何使用 Pandas 解决一个实际的数据处理问题,即根据一个 DataFrame 的信息,在另一个 DataFrame 中查找满足特定条件的行。通过使用 map()、groupby() 和布尔索引等 Pandas 功能,可以高效地完成这类任务。在实际应用中,可以根据具体需求调整代码,例如处理缺失值、添加其他筛选条件等。

以上就是使用 Pandas 查找每个 Code 对应的 Rank 最小的 Smth的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

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

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

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