如何基于多列组合筛选Pandas DataFrame?
基于多列组合条件高效筛选Pandas DataFrame
当你需要从包含大量列、数千行的Pandas DataFrame中,根据数千条多列组合条件筛选行时,优先选择向量化操作保证效率,避免逐行循环的低效方案。以下是两种实用且高效的实现方式:
示例数据与条件
先定义示例DataFrame和筛选条件:
import pandas as pd data = {'product_name': ['laptop', 'laptop', 'printer', 'tablet', 'desk', 'chair', 'chair', 'chair'], 'price': [1200, 1000, 150, 300, 450, 200, 100, 120], 'color': ['white', 'black', 'white', 'black', 'brown', 'red', 'grey', 'black'] } df = pd.DataFrame(data) # 多列组合条件列表 conditions = [('laptop', 'black'), ('chair', 'red'), ('chair', 'grey')]
方法1:使用pd.merge(大数据量首选)
将条件列表转换为小型DataFrame,通过内连接(inner join)快速匹配原DataFrame的行,这种方式利用Pandas优化的向量化操作,在数据量较大时性能最优。
# 将条件转为DataFrame,列名需与原DataFrame对应列一致 cond_df = pd.DataFrame(conditions, columns=['product_name', 'color']) # 内连接筛选匹配行 result = pd.merge(df, cond_df, on=['product_name', 'color'], how='inner') print(result)
输出结果:
product_name price color 0 laptop 1000 black 1 chair 200 red 2 chair 100 grey
方法2:使用isin配合列组合元组
如果代码简洁性优先,可将需要匹配的列组合成元组,再用isin判断是否在条件列表中。注意:数据量极大时,该方法性能略逊于merge。
# 将指定列组合成元组序列 combined_cols = df[['product_name', 'color']].apply(tuple, axis=1) # 筛选匹配条件的行 result = df[combined_cols.isin(conditions)] print(result)
注意事项
- 若需扩展到更多列的组合条件,只需调整条件元组的长度,并同步修改
merge的on参数或apply选取的列即可 - 使用
merge时,务必保证条件DataFrame的列名与原DataFrame完全一致,否则会导致匹配失败 - 两种方法都会保留原DataFrame中的重复行,与原数据的重复逻辑一致
内容的提问来源于stack exchange,提问作者Raksha
相关产品推荐
相关产品推荐

