|
😎作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。🤓同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。🌼同时洲洲已经建立了程序员技术交流群,如果您感兴趣,可以私信我加入社群,可以直接vx联系(文末有名片)v:bdizztt🖥随时欢迎您跟我沟通,一起交流,一起成长、进步!点此也可获得联系方式~本文目录前言一、pd.merge()函数简介二、代码场景示例示例1:基于单个键的内连接示例2:基于多个键的外连接示例3:使用索引进行合并示例4:处理重复的列名三、实战案例1、基础数据2、传入的on的参数是列表3、Mergemethod组合4、传入indicator参数5、index为链接键6、sort对链接的键值进行排序注意事项总结前言在数据科学和分析领域,经常需要处理来自不同源的数据集,并将它们合并为一个统一的数据结构以进行进一步的分析。Pandas库中的pd.merge()函数提供了一种灵活的方式来合并两个或多个DataFrame,类似于SQL中的JOIN操作。本文将详细介绍pd.merge()函数的用法,并通过多个代码示例展示其在不同场景下的应用。一、pd.merge()函数简介pd.merge()函数用于根据一个或多个键将不同的数据集合并成一个DataFrame。它非常类似于SQL中的JOIN操作。pd.merge(left,right,how='inner',on=None,left_on=None, right_on=None,left_index=False,right_index=False, sort=True,suffixes=('_x','_y'),copy=True, indicator=False,validate=None)1234参数含义说明如下:left:拼接的左侧DataFrame对象right:拼接的右侧DataFrame对象on:要加入的列或索引级别名称。必须在左侧和右侧DataFrame对象中找到。如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。left_on:左侧DataFrame中的列或索引级别用作键。可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。right_on:左侧DataFrame中的列或索引级别用作键。可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。left_index:如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。right_index:与left_index功能相似。how:Oneof‘left’,‘right’,‘outer’,‘inner’.默认inner。inner是取交集,outer取并集。比如left:[‘A’,‘B’,‘C’];right[’'A,‘C’,‘D’];inner取交集的话,left中出现的A会和right中出现的买一个A进行匹配拼接,如果没有是B,在right中没有匹配到,则会丢失。'outer’取并集,出现的A会进行一一匹配,没有同时出现的会将缺失的部分添加缺失值。sort:按字典顺序通过连接键对结果DataFrame进行排序。默认为True,设置为False将在很多情况下显着提高性能。suffixes:用于重叠列的字符串后缀元组。默认为(‘x’,’y’)。copy:始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此。indicator:将一列添加到名为_merge的输出DataFrame,其中包含有关每行源的信息。_merge是分类类型,并且对于其合并键仅出现在“左”DataFrame中的观察值,取得值为left_only,对于其合并键仅出现在“右”DataFrame中的观察值为right_only,并且如果在两者中都找到观察点的合并键,则为left_only。二、代码场景示例示例1:基于单个键的内连接假设有两个DataFrame,df1和df2,它们有一个共同的列’key’:importpandasaspd#创建两个示例DataFramedf1=pd.DataFrame({'key':['A','B','C'],'value':[1,2,3]})df2=pd.DataFrame({'key':['A','B','D'],'value2':[4,5,6]})#使用'key'列进行合并result=pd.merge(df1,df2,on='key')print(result)12345678910'运行运行示例2:基于多个键的外连接使用left_on和right_on参数基于多个列进行合并:#扩展示例DataFramedf1=pd.DataFrame({'key1':['K0','K1','K2'],'key2':['K0','K1','K2'],'value':[1,2,3]})df2=pd.DataFrame({'key1':['K0','K1','K1'],'key2':['K0','K0','K0'],'value2':[4,5,6]})#使用how='outer'进行外连接result=pd.merge(df1,df2,how='outer',left_on=['key1','key2'],right_on=['key1','key2'])print(result)12345678示例3:使用索引进行合并使用DataFrame的索引作为合并键:#假设df1和df2的索引可以用于合并df1=pd.DataFrame({'value':[1,2,3]},index=['A','B','C'])df2=pd.DataFrame({'value2':[4,5,6]},index=['A','B','D'])#使用索引进行合并result=pd.merge(df1,df2,left_index=True,right_index=True)print(result)12345678示例4:处理重复的列名当两个DataFrame有重复的列名但不是合并键时,可以使用suffixes参数:df1=pd.DataFrame({'value':[1,2,3],'key':['A','B','C']})df2=pd.DataFrame({'value2':[4,5,6],'key':['A','B','D']})#使用suffixes区分重复的列名result=pd.merge(df1,df2,on='key',suffixes=('_left','_right'))print(result)1234567三、实战案例1、基础数据importpandasaspdleft=pd.DataFrame({'key':['K0','K1','K2','K3'],'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3']})right=pd.DataFrame({'key':['K0','K1','K2','K3'],'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3']})result=pd.merge(left,right,on='key')#on参数传递的key作为连接键resultOut[4]:ABkeyCD0A0B0K0C0D01A1B1K1C1D12A2B2K2C2D23A3B3K3C3D3123456789101112131415161718192、传入的on的参数是列表left=pd.DataFrame({'key1':['K0','K0','K1','K2'],'key2':['K0','K1','K0','K1'],'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3']})right=pd.DataFrame({'key1':['K0','K1','K1','K2'],'key2':['K0','K0','K0','K0'],'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3']})result=pd.merge(left,right,on=['key1','key2'])#同时传入两个Key,此时会进行以['key1','key2']列表的形式进行对应,left的keys列表是:[['K0','K0'],['K0','K1'],['K1','K0'],['K2','K1']],left的keys列表是:[['K0','K0'],['K1','K0'],['K1','K0'],['K2','K0']],因此会有1个['K0','K0']、2个['K1','K0']对应。resultOut[6]:ABkey1key2CD0A0B0K0K0C0D01A2B2K1K0C1D12A2B2K1K0C2D21234567891011121314151617181920213、Mergemethod组合需要注意:如果组合键没有出现在左表或右表中,则连接表中的值将为NA。result=pd.merge(left,right,how='left',on=['key1','key2'])#UsekeysfromleftframeonlyresultOut[34]:ABkey1key2CD0A0B0K0K0C0D01A1B1K0K1NaNNaN2A2B2K1K0C1D13A2B2K1K0C2D24A3B3K2K1NaNNaNresult=pd.merge(left,right,how='right',on=['key1','key2'])#UsekeysfromrightframeonlyresultOut[36]:ABkey1key2CD0A0B0K0K0C0D01A2B2K1K0C1D12A2B2K1K0C2D23NaNNaNK2K0C3D3result=pd.merge(left,right,how='outer',on=['key1','key2'])#UseintersectionofkeysfrombothframesresultOut[38]:ABkey1key2CD0A0B0K0K0C0D01A1B1K0K1NaNNaN2A2B2K1K0C1D13A2B2K1K0C2D24A3B3K2K1NaNNaN5NaNNaNK2K0C3D3-----------------------------------------------------left=pd.DataFrame({'A':[1,2],'B':[2,2]})right=pd.DataFrame({'A':[4,5,6],'B':[2,2,2]})result=pd.merge(left,right,on='B',how='outer')resultOut[40]:A_xBA_y012411252126322442255226123456789101112131415161718192021222324252627282930313233343536373839404142434445464、传入indicator参数merge接受参数指示符。如果为True,则将名为_merge的Categorical类型列添加到具有值的输出对象:df1=pd.DataFrame({'col1':[0,1],'col_left':['a','b']})df2=pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})pd.merge(df1,df2,on='col1',how='outer',indicator=True)Out[44]:col1col_leftcol_right_merge00.0aNaNleft_only11.0b2.0both22.0NaN2.0right_only32.0NaN2.0right_only12345678910指标参数也将接受字符串参数,在这种情况下,指标函数将使用传递的字符串的值作为指标列的名称。pd.merge(df1,df2,on='col1',how='outer',indicator='indicator_column')Out[45]:col1col_leftcol_rightindicator_column00.0aNaNleft_only11.0b2.0both22.0NaN2.0right_only32.0NaN2.0right_only12345675、index为链接键需要同时设置left_index=True和right_index=True,或者left_index设置的同时,right_on指定某个Key。总的来说就是需要指定left、right链接的键,可以同时是key、index或者混合使用。left=pd.DataFrame({'A':['A0','A1','A2'],....:'B':['B0','B1','B2']},....:index=['K0','K1','K2'])....:right=pd.DataFrame({'C':['C0','C2','C3'],....:'D':['D0','D2','D3']},....:index=['K0','K2','K3'])....:#只有K0、K2有对应的值pd.merge(left,right,how='inner',left_index=True,right_index=True)Out[51]:ABCDK0A0B0C0D0K2A2B2C2D2left=pd.DataFrame({'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3'],'key':['K0','K1','K0','K1']})right=pd.DataFrame({'C':['C0','C1'],'D':['D0','D1']},index=['K0','K1'])result=pd.merge(left,right,left_on='key',right_index=True,how='left',sort=False)#left_on='key',right_index=TrueresultOut[54]:ABkeyCD0A0B0K0C0D01A1B1K1C1D12A2B2K0C0D03A3B3K1C1D1123456789101112131415161718192021222324252627282930313233343536376、sort对链接的键值进行排序紧接着上一例,设置sort=Trueresult=pd.merge(left,right,left_on='key',right_index=True,how='left',sort=True)resultOut[57]:ABkeyCD0A0B0K0C0D02A2B2K0C0D01A1B1K1C1D13A3B3K1C1D112345678910注意事项合并方式:根据数据的需求选择合适的合并方式(‘inner’,‘outer’,‘left’,‘right’)。数据一致性:确保合并键的数据类型在两个DataFrame中是一致的。索引使用:如果使用索引作为合并键,确保索引是有意义的,且在两个DataFrame中都是唯一的。性能问题:对于大型DataFrame,合并操作可能会消耗较多资源,考虑优化数据或使用数据库处理。重复列名:使用suffixes参数来区分合并后重复的列名。总结📝Hello,各位看官老爷们好,我已经建立了CSDN技术交流群,如果你很感兴趣,可以私信我加入我的社群。📝社群中不定时会有很多活动,例如每周都会包邮免费送一些技术书籍及精美礼品、学习资料分享、大厂面经分享、技术讨论谈等等。📝社群方向很多,相关领域有Web全栈(前后端)、人工智能、机器学习、自媒体副业交流、前沿科技文章分享、论文精读等等。📝不管你是多新手的小白,都欢迎你加入社群中讨论、聊天、分享,加速助力你成为下一个大佬!📝想都是问题,做都是答案!行动起来吧!欢迎评论区or后台与我沟通交流,也欢迎您点击下方的链接直接加入到我的交流社群!~跳转链接社区~
|
|