详解利用Pandas求解两个DataFrame的差集,交集,并集
作者:尤而小屋 发布时间:2023-10-21 06:14:51
标签:Pandas,DataFrame,差集,交集,并集
大家好,我是Peter~
本文讲解的是如何利用Pandas函数求解两个DataFrame的差集、交集、并集。
模拟数据
模拟一份简单的数据:
In [1]:
import pandas as pd
In [2]:
df1 = pd.DataFrame({"col1":[1,2,3,4,5],
"col2":[6,7,8,9,10]
})
df2 = pd.DataFrame({"col1":[1,3,7],
"col2":[6,8,10]
})
In [3]:
df1
Out[3]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 2 | 7 |
2 | 3 | 8 |
3 | 4 | 9 |
4 | 5 | 10 |
In [4]:
df2
Out[4]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 3 | 8 |
2 | 7 | 10 |
两个DataFrame的相同部分:
差集
方法1:concat + drop_duplicates
In [5]:
df3 = pd.concat([df1,df2])
df3
Out[5]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 2 | 7 |
2 | 3 | 8 |
3 | 4 | 9 |
4 | 5 | 10 |
0 | 1 | 6 |
1 | 3 | 8 |
2 | 7 | 10 |
In [6]:
# 结果1
df3.drop_duplicates(["col1","col2"],keep=False)
Out[6]:
col1 | col2 | |
---|---|---|
1 | 2 | 7 |
3 | 4 | 9 |
4 | 5 | 10 |
2 | 7 | 10 |
方法2:append + drop_duplicates
In [7]:
df4 = df1.append(df2)
df4
Out[7]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 2 | 7 |
2 | 3 | 8 |
3 | 4 | 9 |
4 | 5 | 10 |
0 | 1 | 6 |
1 | 3 | 8 |
2 | 7 | 10 |
In [8]:
# 结果2
df4.drop_duplicates(["col1","col2"],keep=False)
Out[8]:
col1 | col2 | |
---|---|---|
1 | 2 | 7 |
3 | 4 | 9 |
4 | 5 | 10 |
2 | 7 | 10 |
交集
方法1:merge
In [9]:
# 结果
# 等效:df5 = pd.merge(df1, df2, how="inner")
df5 = pd.merge(df1,df2)
df5
Out[9]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 3 | 8 |
方法2:concat + duplicated + loc
In [10]:
df6 = pd.concat([df1,df2])
df6
Out[10]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 2 | 7 |
2 | 3 | 8 |
3 | 4 | 9 |
4 | 5 | 10 |
0 | 1 | 6 |
1 | 3 | 8 |
2 | 7 | 10 |
In [11]:
s = df6.duplicated(subset=['col1','col2'], keep='first')
s
Out[11]:
0 False
1 False
2 False
3 False
4 False
0 True
1 True
2 False
dtype: bool
In [12]:
# 结果
df8 = df6.loc[s == True]
df8
Out[12]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 3 | 8 |
方法3:concat + groupby + query
In [13]:
# df6 = pd.concat([df1,df2])
df6
Out[13]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 2 | 7 |
2 | 3 | 8 |
3 | 4 | 9 |
4 | 5 | 10 |
0 | 1 | 6 |
1 | 3 | 8 |
2 | 7 | 10 |
In [14]:
df9 = df6.groupby(["col1", "col2"]).size().reset_index()
df9.columns = ["col1", "col2", "count"]
df9
Out[14]:
col1 | col2 | count | |
---|---|---|---|
0 | 1 | 6 | 2 |
1 | 2 | 7 | 1 |
2 | 3 | 8 | 2 |
3 | 4 | 9 | 1 |
4 | 5 | 10 | 1 |
5 | 7 | 10 | 1 |
In [15]:
df10 = df9.query("count > 1")[["col1", "col2"]]
df10
Out[15]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
2 | 3 | 8 |
并集
方法1:concat + drop_duplicates
In [16]:
df11 = pd.concat([df1,df2])
df11
Out[16]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 2 | 7 |
2 | 3 | 8 |
3 | 4 | 9 |
4 | 5 | 10 |
0 | 1 | 6 |
1 | 3 | 8 |
2 | 7 | 10 |
In [17]:
# 结果
# df12 = df11.drop_duplicates(subset=["col1","col2"],keep="last")
df12 = df11.drop_duplicates(subset=["col1","col2"],keep="first")
df12
Out[17]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 2 | 7 |
2 | 3 | 8 |
3 | 4 | 9 |
4 | 5 | 10 |
2 | 7 | 10 |
方法2:append + drop_duplicates
In [18]:
df13 = df1.append(df2)
# df13.drop_duplicates(subset=["col1","col2"],keep="last")
df13.drop_duplicates(subset=["col1","col2"],keep="first")
Out[18]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 2 | 7 |
2 | 3 | 8 |
3 | 4 | 9 |
4 | 5 | 10 |
2 | 7 | 10 |
方法3:merge
In [19]:
pd.merge(df1,df2,how="outer")
Out[19]:
col1 | col2 | |
---|---|---|
0 | 1 | 6 |
1 | 2 | 7 |
2 | 3 | 8 |
3 | 4 | 9 |
4 | 5 | 10 |
5 | 7 | 10 |
来源:https://mp.weixin.qq.com/s/kmuVEdt13c8qRFA6w5lYFw


猜你喜欢
- 一 使用SELECT子句进行多表查询SELECT 字段名 FROM 表1,表2 …&nbs
- pop()函数1、描述pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。语法pop()方法语法:list.p
- Ctrl+N 按文件名搜索py文件ctrl+n可以搜索py文件勾选上面这个框可以搜索工程以外的文件Ctrl+shift+N 按文件名搜索所有
- 我就废话不多说了,大家还是直接看代码吧~package main import "os" func main () {
- 在某些情况下,如果明知道查询结果只有一个,SQL语句中使用LIMIT 1会提高查询效率。 例如下面的用户表(主键id,邮箱,密码): cre
- 导读:随着大数据概念的火热,啤酒与尿布的故事广为人知。我们如何发现买啤酒的人往往也会买尿布这一规律?数据挖掘中的用于挖掘频繁项集和关联规则的
- 首先上一段程序:import numpy as nplist_a = list(range(10))print("list_a:
- 本文转自微信公众号:"算法与编程之美",一、问题描述在collections模块中的defauldict使用时与dict
- 本文实例讲述了Python学习笔记之迭代器和生成器用法。分享给大家供大家参考,具体如下:迭代器和生成器迭代器每次可以返回一个对象元素的对象,
- 这篇文章主要介绍了如何使用Python抓取网页tag操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- sync.WaitGroup对于Golang开发者来说并不陌生,其经常作为多协程之间同步的一种机制。用好它势必会让你事半功倍,但是一旦错用将
- 实现2048相对来说比较简单,用4*4的二维数组保存地图,pygame.key.get_pressed()获取键盘操作,详见代码。效果图代码
- 需求查询某个字段的时候需要给一个字段同样的值。这个值你可以写死,也可以从数据库获取1、写死值SELECT mfr_id AS mfrId,
- 将套接字流重定向到标准输入或输出流#!/usr/bin/env python3"""测试socket-stre
- 一、出现原因:readline模块没有安装二、解决方式:# 安装readline模块yum -y install readline-deve
- 背景:在自动化化测试过程中,不方便准确获取页面的元素,或者在重构过程中方法修改造成元素层级改变,因此通过设置id准备定位。一、python准
- 1.关闭浏览器全部标签页driver.quit()2.关闭当前标签页(从标签页A打开新的标签页B,关闭标签页A)driver.close()
- 一、了解seleniumSelenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safar等浏览
- 导语“超级玛丽”——有多少人还记得这款经典游戏?那个戴帽子的大胡子穿着背带裤的马里奥!带您重温经典的回忆,超级马里奥拯救不开心!炫酷来袭。如
- 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的