如何通过PRODUCT_ID与COUNTRY_CODE元组列表过滤Pandas DataFrame
问题描述
我有一个格式为(PRODUCT_ID, COUNTRY_CODE)的元组列表:
[(1111, 'CO'), (2222, 'CO'), (1111, 'BR')]
同时有如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({ 'COUNTRY_CODE': ['CO','CO','CO','BR','BR','BR','CO'], 'VERTICAL_GROUP_ID': [2,2,3,2,3,3,3], 'SUB_VERTICAL': ['SUPER','SUPER','HOME','LICOR','SPORTS','HOME','TECH'], 'PRODUCT_ID': [1111,3333,1111,4444,1111,2222,2222], 'SHOWN': [7,8,12,14,16,1,13], })
请问如何根据元组列表中的PRODUCT_ID和COUNTRY_CODE值过滤该DataFrame,得到如下结果?
| COUNTRY_CODE | VERTICAL_GROUP_ID | SUB_VERTICAL | PRODUCT_ID | SHOWN |
|---|---|---|---|---|
| CO | 2 | SUPER | 1111 | 7 |
| CO | 3 | HOME | 1111 | 12 |
| BR | 3 | SPORTS | 1111 | 16 |
| CO | 3 | TECH | 2222 | 13 |
解决方案
方法一:使用apply+isin
将DataFrame中PRODUCT_ID和COUNTRY_CODE列逐行转为元组,再匹配目标元组列表进行过滤:
# 定义目标元组列表 target_tuples = [(1111, 'CO'), (2222, 'CO'), (1111, 'BR')] # 生成匹配布尔序列并过滤 filtered_df = df[df[['PRODUCT_ID', 'COUNTRY_CODE']].apply(tuple, axis=1).isin(target_tuples)]
方法二:使用merge(大数据量更高效)
把目标元组转为临时DataFrame,通过合并操作实现过滤:
# 将目标元组转为DataFrame target_df = pd.DataFrame(target_tuples, columns=['PRODUCT_ID', 'COUNTRY_CODE']) # 合并过滤 filtered_df = df.merge(target_df, on=['PRODUCT_ID', 'COUNTRY_CODE'])
两种方法最终都会得到你需要的结果,方法二更适合处理大规模数据集,因为merge是向量化操作,效率优于逐行处理的apply。
内容的提问来源于stack exchange,提问作者Alain
相关产品推荐
相关产品推荐

