大家好,欢迎来到IT知识分享网。
在生活和工作中,有许多表格的数据要我们进行查询和判断,用excel表格做这些数据的工作量总是很大。如何用python中的pandas库写一段查询的代码,来一劳永逸的解决这些麻烦的问题呢?merge函数站了出来。它就是为了查询数据而生的。
在讲解merge函数时,这里先为大家介绍关于数据库查询的一些知识:在查询数据的时候,根据不同的需求我们可以将查询分为:内连接,外连接,自连接和子链接。
0.概念介绍:
内连接:返回两个数据集的交集部分
外连接:分左右外连接,左外连接返回左边数据的全部数据和右边数据的交集,右外连接同理
自连接:当一个表中有相对应的两列,如:所有员工表中的ID和组长ID,自连接可以对单表实现查询。
条件连接:自定义一个条件或去求,基于该条件对两个数据集进行连接,并返回符合条件的子集。
1.参数介绍:
merge函数的参数不止这些,使用起来非常灵活,这里我只把使用频率高的参数写了出来
2.实例介绍:
(1)内连接
import pandas as pd # 创建示例数据框,员工的id数据集 emp_id emp_id = pd.DataFrame({ 'ID': [1, 2, 3, 4], 'Name': ['A', 'B', 'C', 'D'] }) # 创建示例数据框,员工的age数据集 emp_age emp_age = pd.DataFrame({ 'ID': [3, 4, 5, 6], 'Age': [25, 30, 35, 40] }) print("emp_id:") print(emp_id) print("\nemp_age:") print(emp_age) # 我们要查询在emp_id和emp_age中都存在的员工,可以使用内连接. # 而两个数据集中都存在相同列:‘ID’,我们可以用ID作为连接键,在how参数中传递inner表示内连接,即可完成查询 inner_join = pd.merge(emp_id, emp_age, on='ID', how='inner') print("\nInner Join:") print(inner_join) ''' 结果演示: emp_id: ID Name 0 1 A 1 2 B 2 3 C 3 4 D emp_age: ID Age 0 3 25 1 4 30 2 5 35 3 6 40 Inner Join: ID Name Age 0 3 C 25 1 4 D 30 '''
可见,内连接将两个表中共同的内容连接到了一起
(2)外连接
import pandas as pd # 创建示例数据框,员工的id数据集 emp_id emp_id = pd.DataFrame({ 'ID': [1, 2, 3, 4], 'Name': ['A', 'B', 'C', 'D'] }) # 创建示例数据框,员工的age数据集 emp_age emp_age = pd.DataFrame({ 'ID': [3, 4, 5, 6], 'Age': [25, 30, 35, 40] }) print("emp_id:") print(emp_id) print("\nemp_age:") print(emp_age) # 执行右外连接操作 right_join = pd.merge(emp_id, emp_age, on='ID', how='right') print("\nRight Join:") print(right_join) # 执行左外连接操作 left_join = pd.merge(emp_id, emp_age, on='ID', how='left') print("\nLeft Join:") print(left_join) ''' 结果演示: emp_id: ID Name 0 1 A 1 2 B 2 3 C 3 4 D emp_age: ID Age 0 3 25 1 4 30 2 5 35 3 6 40 Right Join: ID Name Age 0 3 C 25 1 4 D 30 2 5 NaN 35 3 6 NaN 40 Left Join: ID Name Age 0 1 A NaN 1 2 B NaN 2 3 C 25.0 3 4 D 30.0 '''
可见左右外连接只需要改变how参数即可,left是左外连接,right是右外连接,从代码中可以看出来右连接保留右表中的所有数据,而返回左表中的交集部分,左表在右表中不存在的部分用NaN表示。左外连接保留左表中的所有数据,而返回右表中的交集部分,右表在左表中不存在的部分用NaN表示。当然,如果how是outer的话则是普通的外连接,保留两个DataFrame对象中所有的行,并在缺失值处填充NaN。
(3)自连接
import numpy as np import pandas as pd # 创建示例数据框,员工和老板的混合数据集 emp emp = pd.DataFrame({ 'ID': [1, 2, 3, 4], 'Name': ['A', 'B', 'C', 'D'], 'BOSS_ID': [np.NaN, 1, np.NaN, 3] }) print("emp:") print(emp) # 执行自连接操作 self_join = pd.merge(emp, emp, left_on='ID', right_on='BOSS_ID') print("\nSelf Join:") print(self_join) ''' 结果演示 emp: ID Name BOSS_ID 0 1 A NaN 1 2 B 1.0 2 3 C NaN 3 4 D 3.0 Self Join: ID_x Name_x BOSS_ID_x ID_y Name_y BOSS_ID_y 0 1 A NaN 2 B 1.0 1 3 C NaN 4 D 3.0 '''
在进行自连接时,传入的两个数据集的参数都是一张表即可。在代码中,显然ID和BOSS_ID有关联,所以这时候要用到参数left_on和参数right_on来选择左侧和右侧保留的列名。
ID_x、Name_x和BOSS_ID_x分别表示左侧数据集(即原始数据集)中的ID、Name和BOSS_ID列。ID_y、Name_y和BOSS_ID_y则是右侧数据集(即自连接后的数据集)中的相同列,这些列来自于与左侧数据集相同的数据表(即emp表本身)。
在自连接操作中,左侧数据集中的每一行都会与右侧数据集中的每一行进行比较,以找到满足连接条件的匹配。然后,匹配的结果会以新的列名(带有 _x 和 _y 后缀)的形式显示在结果中,以区分它们来自于哪个数据集。这里左侧连接保留了ID列,右侧保留BOSS_ID列,可以更直观判断出哪些人有老板,那些人没有老板。
(4)条件连接
import pandas as pd # 创建员工信息数据框 employee_data = { 'employee_id': [1, 2, 3, 4], 'employee_name': ['A', 'B', 'C', 'D'], } employees_df = pd.DataFrame(employee_data) # 创建销售额信息数据框 sales_data = { 'employee_id': [1, 2, 3, 4], 'sales_amount': [1500, 800, 1200, 900] } sales_df = pd.DataFrame(sales_data) # 将两个数据框按照 employee_id 列进行连接,并使用布尔索引筛选销售额大于 1000 的行 merged_df = pd.merge(employees_df, sales_df, on='employee_id', how='inner') #这里在连接完后直接用切片内编写条件函数即可判断 merged_df = merged_df[merged_df['sales_amount'] > 1000] # 打印条件连接后的结果 print(merged_df) ''' 结果演示: employee_id employee_name sales_amount 0 1 A 1500 2 3 C 1200 '''
条件连接很简单,只需要在掌握所有的内外连接后,在连接函数之后使用切片来进行条件需求的判断即可。
希望大家在掌握merge()函数这把利剑后,可以通过查询自动化斩断所有工作中的乱麻,在pandas中传入你的excel数据后,我们会更多的时间可以来享受生活和咖啡
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/110358.html