You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多列匹配条件筛选Pandas DataFrame?

筛选匹配年份与冠军的比赛数据

数据结构(简化版)

import pandas as pd

# 冠军数据
Winner = [[1938,"Italy"],[1950,"Uruguay"],[2014,"Germany"]]
df = pd.DataFrame(Winner, columns=['Year', 'Winner'])

# 比赛数据
MatchB = [[1938,"Germany",1.0],[1938,"Germany",2.0],[1938,"Brazil",1.0],[1950,"Italy",2.0],[1950,"Spain",2.0],[1950,"Spain",1.0],[1950,"Spain",1.0],[1950,"Brazil",1.0],
[2014,"Italy",2.0],[2014,"Spain",3.0],[2014,"Germany",1.0]]
df2B = pd.DataFrame(MatchB, columns=['Year', 'Away Team Name','Away Team Goals'])

解决方案

方法1:使用merge内连接

通过列名对齐后执行内连接,仅保留Year和球队名称同时匹配的行:

# 重命名df的Winner列,与df2B的Away Team Name统一
df_matching = df.rename(columns={'Winner': 'Away Team Name'})
# 内连接筛选匹配行
filtered_result = pd.merge(df2B, df_matching, on=['Year', 'Away Team Name'], how='inner')
print(filtered_result)

方法2:元组集合匹配

将目标匹配对转为集合,逐行校验是否符合条件:

# 生成(年份, 冠军球队)的元组集合
target_pairs = set(zip(df['Year'], df['Winner']))
# 筛选符合条件的行
filtered_result = df2B[df2B.apply(lambda r: (r['Year'], r['Away Team Name']) in target_pairs, axis=1)]
print(filtered_result)

方法3:query简洁语法

利用query结合集合实现快速筛选:

target_pairs = set(zip(df['Year'], df['Winner']))
filtered_result = df2B.query('(Year, `Away Team Name`) in @target_pairs')
print(filtered_result)

三种方法最终都会得到相同的筛选结果:仅保留2014年德国作为客队的那一行数据。

内容的提问来源于stack exchange,提问作者Chery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:55:30