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

Pandas筛选匹配值对列表的DataFrame行失败,求解决方案

解决方法

你的问题出在isin(c)的逻辑上——它是检查单个元素是否在c的所有元素集合里,而不是检查A和B的组合值对是否匹配c里的某一组。比如dfa[['A','B']].isin(c)会把c拆成所有单个数字的集合(1,100,2,200...),然后判断每个单元格的值是否在这个集合里,再用all(axis=1)要求每行的两个单元格都在集合里,这完全偏离了你要的“匹配完整值对”的需求,自然得不到正确结果。

给你两种靠谱的解决方式:

方式一:转成元组匹配

把c里的列表值对转成元组,再把原DataFrame的A、B行也转成元组,直接用isin检查整行的元组是否在目标集合里:

import pandas as pd

c = [[1, 100], [2,200], [3, 300], [5,500]]  # 按你实际需要的匹配值对调整
dfa = pd.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [100, 200, 300, 400, 500, 600]})

# 把值对转成元组集合
c_tuples = tuple(tuple(pair) for pair in c)
# 筛选匹配的行
d2 = dfa[dfa[['A', 'B']].apply(tuple, axis=1).isin(c_tuples)]
print(d2)

运行后会返回A为1、2、3、5的4行,完全符合值对匹配的预期。

方式二:用merge内连接

把c转成临时DataFrame,和原dfa做内连接,自动筛选出匹配的行,这种方法在数据量较大时效率更高:

import pandas as pd

c = [[1, 100], [2,200], [3, 300], [5,500]]
dfa = pd.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [100, 200, 300, 400, 500, 600]})

# 把c转成和原df同列名的DataFrame
c_df = pd.DataFrame(c, columns=['A', 'B'])
# 内连接只保留两表都存在的行(即值对匹配的行)
d2 = dfa.merge(c_df, on=['A', 'B'], how='inner')
print(d2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:40:18