看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求是有两个相同结构的数据表,已知第二个表是第一个表的部分数据,需要以其中两列为单位,判断在第一个表中存在,在另外一个表中不存在的数据。
两个表 df1 和 df2 如下:
import pandas as pd
pd.__version__
# '1.2.3'
# 数据1
df1 = pd.DataFrame({
'x': ['a', 'b', 'c', 'd', 'e'],
'y': [1, 2, 3, 2, 1],
'z': ['how', 'are', 'you', 'fine', 'thanks']
})
df1
'''
x y z
0 a 1 how
1 b 2 are
2 c 3 you
3 d 2 fine
4 e 1 thanks
'''
# 数据2
df2 = pd.DataFrame({
'x': ['a', 'b', 'c'],
'y': [1, 2, 3],
'z': ['what', 'is', 'you']
})
df2
'''
x y z
0 a 1 what
1 b 2 is
2 c 3 you
'''
如以上数据,df1 中包含了 df2 的内容,现在需要以 x、y 列组合为整体,看 df1 中存在,在 df2 中不存在的数据。其中,z 列的内容认为信息过载的数据,我们不用关心。
很明显,df1 最后两行,不在 df2 中。
我们先将 df1 和 df2 的 x、y 列取出,组合为元组形成,这样就先成为一个整体,形成了两个 Series,然后我们用 Series 的 isin 方法来判断是否存在。得到是不否存在的布尔序列后,再应用到 df1,这里我们需要不存在的可以用 ~
取反,具体可以看代码实现。
根据以上思路,先将 x 和 y 列转为一个序列:
df1[['x','y']].apply(tuple, axis=1)
'''
0 (a, 1)
1 (b, 2)
2 (c, 3)
3 (d, 2)
4 (e, 1)
dtype: object
'''
再将 df2 的两列做以上操作后转为列表,方便使用 isin 检测操作:
df2[['x','y']].apply(tuple, axis=1).to_list()
# [('a', 1), ('b', 2), ('c', 3)]
最后是整个判断检测结果:
slice_lable = (
df1[['x','y']].apply(tuple, axis=1)
.isin(df2[['x','y']].apply(tuple, axis=1)
.to_list()
)
)
slice_lable
'''
0 True
1 True
2 True
3 False
4 False
dtype: bool
'''
最后,再应用到筛选操作上:
# 在 df1 中存在,df2 中不存在的
df1[~slice_lable]
'''
x y z
3 d 2 fine
4 e 1 thanks
'''
最终得到了我们想要的结果。
(完)
更新时间:Aug. 18, 2024, 3:41 p.m. 标签:pandas python 比较