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
相关产品推荐
相关产品推荐

