如何在Python的where条件中传入向量?DataFrame过滤问题
解决Pandas中用另一DataFrame的列作为筛选条件的问题
嘿,刚从R转Python做数据科学&机器学习是吧?太懂这种切换工具时的小迷茫了——毕竟R和Pandas的语法逻辑确实有不少不一样的地方~你想要实现的就是用df2里的age1向量作为条件,筛选出df1中age1列匹配这些值的行,对吧?这在Pandas里其实有几种很常用的方法,我给你一步步说清楚:
方法1:用isin()实现(对应R中的%in%)
这是最直接对应你R中使用习惯的方法,Pandas里的isin()函数就是用来检查元素是否存在于目标序列中的,用法和R的%in%几乎一致:
import pandas as pd raw_data1 = {'age1': [23,45,21],'age2': [10,20,50], 'age3':[44,55,77]} df1 = pd.DataFrame(raw_data1, columns = ['age1','age2','age3']) raw_data2 = {'age1': [23,45]} df2 = pd.DataFrame(raw_data2, columns = ['age1']) # 核心代码:筛选df1中age1在df2.age1里的行 filtered_df = df1[df1['age1'].isin(df2['age1'])] print(filtered_df)
运行后你会得到预期的结果:
age1 age2 age3 0 23 10 44 1 45 20 55
简单解释下:df1['age1'].isin(df2['age1'])会返回一个布尔型的Series(和df1行数一致),标记每一行的age1是否在df2的age1列表里;然后用这个布尔Series作为索引,就能提取出符合条件的行。
方法2:用merge()做内连接
如果之后你需要处理更复杂的表关联场景,用merge()做内连接也是个好选择,它会只保留两个表中age1匹配的行:
filtered_df = pd.merge(df1, df2, on='age1', how='inner') print(filtered_df)
这个方法的结果和上面完全一样,不过如果df2还有其他列,merge会自动把这些列也合并进来,适合多字段关联的场景。
小提示
- 如果df2的age1有重复值,
isin()会依然正常匹配(重复值不会影响筛选结果);但merge()会产生笛卡尔积,这时候你可能需要加上drop_duplicates()先去重df2的age1列。 - 如果你习惯R的dplyr风格,也可以试试Pandas的
query()方法,写成df1.query('age1 in @df2.age1'),语法更贴近自然语言~
内容的提问来源于stack exchange,提问作者Murali
相关产品推荐
相关产品推荐

