在Pandas中如何在某些匹配条件下进行LEFT ANTI连接
LEFT ANTI Join与半连接相反。不包括交集,它返回左表。它只返回左表的列,不返回右表的列。
方法1:使用isin()
在创建的数据帧上,我们使用isin()函数进行左键连接和子集,以检查数据集被合并的部分是否在合并后的数据集的子集中。
语法 :DataFrame.isin(values)
参数 :
- values:可迭代的,系列的,数据框架的或dict的
返回值 : DataFrame
示例 :
在下面的代码中,我们使用指标来寻找 “仅剩 “的行,并对合并后的数据集进行子集,然后将其分配给df1。
# importing packages
import pandas as pd
# anti-join
# creating dataframes using pd.DataFrame() method.
df1 = pd.DataFrame({
"city": ["new york", "chicago", "orlando", 'mumbai'],
"temperature": [21, 14, 35, 30],
"humidity": [65, 68, 75, 75],
})
df2 = pd.DataFrame({
"city": ["chicago", "new york", "orlando"],
"humidity": [67, 60, 70]
})
# carrying out anti join using merge method
df3 = df1.merge(df2, on='city', how='left', indicator=True)
df = df3.loc[df3['_merge'] == 'left_only', 'city']
d = df1[df1['city'].isin(df)]
print(d)
输出:
city temperature humidity
3 mumbai 30 75
方法2:使用半连接
我们可以在半连接上使用’~’运算符。它的结果是反连接。
半连接 :类似于内联,半联接返回交集,但它只返回左表的列,而不是右表的列。它没有重复的值。
语法 :
[~df1[‘column_name’].isin(df2[‘column_name’])]
其中,
- df1 是第一个数据框架
- df2 是第二个数据框架
- column_name 是两个数据框架中的匹配列
示例 :
在这个例子中,我们在’city’上合并df1和df2,默认是’内联’,合并后,我们排除了df1中在df3中的部分,并打印出结果数据框。
# code
import pandas as pd
# inverse of semi-join:
# creating dataframes using pd.DataFrame() method.
df1 = pd.DataFrame({
"city": ["new york", "chicago", "orlando", 'mumbai'],
"temperature": [21, 14, 35, 30],
"humidity": [65, 68, 75, 75],
})
df2 = pd.DataFrame({
"city": ["chicago", "new york", "orlando"],
"humidity": [67, 60, 70]
})
# carrying out anti join using merge method
df3 = df1.merge(df2, on='city')
df = df1[~df1['city'].isin(df3['city'])]
print(df)
输出 :
city temperature humidity
3 mumbai 30 75