基于关联ID与日期从另一DataFrame匹配取值的技术问询
Pandas 基于关联ID与日期筛选DataFrame记录
需求说明
现有三个Pandas DataFrame:df_k、df_w和关联表df_related,需要从df_w中筛选出满足以下条件的记录:
- 记录的
id_w经df_related映射后,对应df_k中的id_k - 记录的
date与df_k中对应id_k的日期完全匹配
示例数据
import pandas as pd # df_k数据 df_k = pd.DataFrame({ 'id_k': [3, 4, 4], 'date': ['2021-05-01', '2021-05-01', '2021-05-02'] }) # 关联表df_related df_related = pd.DataFrame({ 'id_w': [1, 2, 3], 'id_k': [3, 4, 5] }) # df_w数据 df_w = pd.DataFrame({ 'id_w': [1, 1, 2, 2, 3], 'date': ['2021-05-01', '2021-05-02', '2021-05-01', '2021-05-02', '2021-05-01'], 'val': [1, -1, 2, -2, 6] })
实现方案
方法1:合并关联表生成匹配对,再筛选
先通过merge将df_k与关联表结合,得到所有需要匹配的(id_w, date)组合,再用这个组合筛选df_w:
# 生成需要匹配的(id_w, date)对 matched_pairs = df_k.merge(df_related, on='id_k', how='inner')[['id_w', 'date']] # 筛选df_w中符合条件的记录 result = df_w.merge(matched_pairs, on=['id_w', 'date'], how='inner')
方法2:用元组匹配筛选
将匹配对转为元组列表,通过isin实现多列匹配筛选:
# 生成匹配元组列表 match_tuples = list(matched_pairs.itertuples(index=False, name=None)) # 筛选符合条件的记录 result = df_w[df_w[['id_w', 'date']].apply(tuple, axis=1).isin(match_tuples)]
输出结果
两种方法最终都会得到符合要求的结果:
id_w date val 0 1 2021-05-01 1 1 2 2021-05-01 2 2 2 2021-05-02 -2
逻辑说明
- 第一步通过关联表
df_related将df_k中的id_k映射为对应的id_w,同时保留df_k中的日期,得到所有合法的id_w与日期组合。 - 第二步从
df_w中筛选出包含这些合法组合的记录,确保同时满足ID映射和日期匹配的条件。
内容的提问来源于stack exchange,提问作者Sadcow
相关产品推荐
相关产品推荐

