如何在Pandas中用类SQL子查询筛选符合条件的车辆价值数据
解决方案:找出符合条件的Person的Car价值
嘿,作为Pandas新手,你这个问题非常典型——很多从SQL转过来的同学都会好奇怎么在Pandas里实现子查询逻辑。我来一步步给你拆解,同时对比你熟悉的SQL思路~
原始数据回顾
首先你的示例DataFrame是这样的:
import pandas as pd df = pd.DataFrame({ 'Person': ['Adam', 'Adam', 'Cesar', 'Diana', 'Diana', 'Diana', 'Erika', 'Erika'], 'Belonging': ['House', 'Car', 'Car', 'House', 'Car', 'Bike', 'House', 'Car'], 'Value': [300, 10, 12, 450, 15, 2, 600, 11], })
输出结果:
Person Belonging Value 0 Adam House 300 1 Adam Car 10 2 Cesar Car 12 3 Diana House 450 4 Diana Car 15 5 Diana Bike 2 6 Erika House 600 7 Erika Car 11
方法1:最贴近SQL子查询的实现
你的SQL语句用IN子查询先筛选目标Person,再过滤Car记录,对应Pandas里可以用isin()方法实现完全一致的逻辑:
# 第一步:找出拥有价值超过400的House的Person列表 target_people = df[(df['Belonging'] == 'House') & (df['Value'] > 400)]['Person'].unique() # 第二步:筛选这些Person对应的Car记录 result = df[(df['Person'].isin(target_people)) & (df['Belonging'] == 'Car')]
运行后得到你想要的结果:
Person Belonging Value 4 Diana Car 15 7 Erika Car 11
方法2:用query()直接写类SQL语句
如果你更习惯SQL语法,可以用query()方法,甚至能写出几乎和SQL一模一样的子查询语句,用@引用子查询结果:
result = df.query( "Person in @(df[(Belonging=='House') & (Value>400)]['Person']) & Belonging=='Car'" )
这种写法对SQL用户来说几乎零学习成本,非常直观!
方法3:Pandas风格的分组标记法
如果你想贴合Pandas的向量化操作习惯,可以用groupby+transform给每个Person标记是否符合条件,再筛选:
# 给每个Person添加标记:是否拥有价值超400的House df['has_high_value_house'] = df.groupby('Person').apply( lambda x: ((x['Belonging'] == 'House') & (x['Value'] > 400)).any() ) # 筛选符合条件的Car记录并移除标记列 result = df[(df['has_high_value_house']) & (df['Belonging'] == 'Car')].drop('has_high_value_house', axis=1)
关于Pandas的「子查询」机制
当然有!Pandas完全支持类似SQL的子查询逻辑:
- 第一种方法的
isin()就对应SQL的IN子查询; query()方法允许你直接编写类SQL的查询语句,包括嵌套子查询;- 你也可以先创建子DataFrame(对应SQL的子查询结果),再通过
merge等操作和原表关联,这也是子查询的一种实现方式。
这些方法各有优劣:第一种最贴近SQL思路,容易上手;query()语法熟悉;分组方法更适合复杂的分组条件场景。你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Snowrabbit
相关产品推荐
相关产品推荐

