基于特定条件从Pandas DataFrame中提取指定分组
高效提取包含指定条件行的X/Y分组数据
针对你的需求,完全可以用Pandas的向量化操作替代低效的逐行迭代,以下两种方法都能高效实现目标:
方法一:使用groupby.filter(最直观)
利用groupby.filter直接对每个X/Y分组做判断,保留存在至少一行满足Name='J'且Age=33的分组的所有行:
import pandas as pd df = pd.DataFrame({ 'X': [1,1,1,1,2,2,2,2], 'Y': [3,3,4,4,3,3,4,4], 'Name': ['J', 'A', 'B', 'X', 'V', 'P', 'J', 'V'], 'Age': [33,47,53,22,33,80,33,93] }) # 筛选符合条件的分组 filtered_df = df.groupby(['X', 'Y']).filter( lambda group: ((group['Name'] == 'J') & (group['Age'] == 33)).any() ) print(filtered_df)
运行结果:
X Y Name Age 0 1 3 J 33 1 1 3 A 47 4 2 3 V 33 5 2 3 P 80
方法二:先提取目标分组再合并(性能更优)
先定位所有满足条件的X/Y唯一组合,再通过合并筛选出这些分组的所有行,数据量较大时这个方法性能表现更好:
# 第一步:获取所有符合条件的X,Y唯一组合 target_groups = df[(df['Name'] == 'J') & (df['Age'] == 33)][['X', 'Y']].drop_duplicates() # 第二步:筛选属于目标分组的所有行 filtered_df = df.merge(target_groups, on=['X', 'Y']) print(filtered_df)
得到的结果和方法一完全一致。
效率对比说明
逐行迭代(比如iterrows())是纯Python层面的循环,效率极低;而上述两种方法都是基于Pandas底层的向量化操作(C语言实现),计算速度会提升数倍甚至数十倍,尤其当数据量达到十万级以上时,差距会非常明显。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

