如何用Python(Pandas/循环)基于两个DataFrame匹配生成结果表df_3?
如何用Python(Pandas/循环)基于两个DataFrame匹配生成结果表df_3?
嘿,我来帮你搞定这个问题!首先咱们得先明确下数据结构,虽然你没给出具体的表内容,但我先模拟一组常见的样例数据,方便你对应自己的情况调整~
先假设咱们的样例数据:
import pandas as pd # 模拟df_1:包含需要匹配的code和其他信息 df_1 = pd.DataFrame({ "code": ["A001", "B002", "C003"], "name": ["Alice", "Bob", "Charlie"] }) # 模拟df_2:包含code、rank和对应的数据 df_2 = pd.DataFrame({ "code": ["A001", "A001", "A001", "B002", "B002", "C003"], "rank": [3, 1, 2, 2, 1, 1], "score": [85, 90, 88, 75, 80, 95] })
方法一:用Pandas的分组+合并(推荐,效率更高)
核心思路是先把df_2里每个code对应的最低rank记录筛选出来,再和df_1做合并,这样就能得到df_3了:
# 1. 对df_2按code分组,每组取rank最小的行 # 如果有多个相同最低rank的记录,用keep='first'取第一条,也可以根据需求改 df_2_min_rank = df_2.loc[df_2.groupby('code')['rank'].idxmin()] # 2. 和df_1合并,基于code列匹配 df_3 = pd.merge(df_1, df_2_min_rank, on='code', how='left') print(df_3)
运行后得到的df_3就是你要的结果:
code name rank score 0 A001 Alice 1 90 1 B002 Bob 1 80 2 C003 Charlie 1 95
方法二:用循环实现(适合理解逻辑,小数据量可用)
如果你更倾向于用循环来逐行处理,也可以这么写:
# 初始化df_3,先复制df_1的结构,再添加需要的列 df_3 = df_1.copy() df_3['rank'] = None df_3['score'] = None # 这里的列名根据你实际需求调整 # 遍历df_1的每一行 for idx, row in df_1.iterrows(): current_code = row['code'] # 筛选df_2中当前code的所有记录 code_matches = df_2[df_2['code'] == current_code] # 找到rank最小的那条记录 min_rank_row = code_matches[code_matches['rank'] == code_matches['rank'].min()] # 把数据填充到df_3中 if not min_rank_row.empty: df_3.loc[idx, 'rank'] = min_rank_row['rank'].values[0] df_3.loc[idx, 'score'] = min_rank_row['score'].values[0] print(df_3)
这个方法和上面的结果是一样的,只是用了循环逐行处理,数据量大的话效率会比Pandas的向量操作低一些,所以更推荐第一种方法~
补充说明
如果你的需求是“从最低rank开始对比,找到符合某个条件的记录”(比如rank最低且满足其他条件),只需要在筛选的时候加上对应的条件就行,比如:
# 示例:取每个code中rank最低且score>80的记录 df_2_filtered = df_2[(df_2['rank'] == df_2.groupby('code')['rank'].transform('min')) & (df_2['score'] > 80)] df_3 = pd.merge(df_1, df_2_filtered, on='code', how='left')
备注:内容来源于stack exchange,提问作者Anticode
相关产品推荐
相关产品推荐

