0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

5个必须知道的Pandas数据合并技巧

数据分析与开发 来源:数据分析与开发 作者:数据分析与开发 2022-04-13 10:35 次阅读

有朋友面试阿里70万总包的数据岗位,对方问Pandas5数据合并的函数,结果他只答出了2个。

b74fcc98-bad1-11ec-aa7f-dac502259ad0.png那么,究竟是哪五个呢?今天,我们就来带大家了解一下!目录:
  • 1. concat

  • 2. append

  • 3. merge

  • 4. join

  • 5. combine

  • 总结

1. concat

concatpandas中专门用于数据连接合并的函数,功能非常强大,支持纵向合并横向合并,默认情况下是纵向合并,具体可以通过参数进行设置。

	
		pd.concat( objs:'Iterable[NDFrame]|Mapping[Hashable,NDFrame]', axis=0, join='outer', ignore_index:'bool'=False, keys=None, levels=None, names=None, verify_integrity:'bool'=False, sort:'bool'=False, copy:'bool'=True, )->'FrameOrSeriesUnion'在函数方法中,各参数含义如下:
objs: 用于连接的数据,可以是DataFrameSeries组成的列表axis=0 : 连接的方式,默认为0也就是纵向连接,可选 1 为横向连接join='outer':合并方式,默认为 inner也就是交集,可选 outer 为并集ignore_index: 是否保留原有的索引keys=None:连接关系,使用传递的值作为一级索引levels=None:用于构造多级索引names=None:索引的名称verify_integrity: 检测索引是否重复,如果为True则有重复索引会报错sort: 并集合并方式下,对columns排序copy: 是否深度拷贝
接下来,我们就对该函数功能进行演示基础连接

	
		In[1]:importpandasaspd In[2]:s1=pd.Series(['a','b']) In[3]:s2=pd.Series(['c','d']) In[4]:s1 Out[4]: 0a 1b dtype:object In[5]:s2 Out[5]: 0c 1d dtype:object In[6]:pd.concat([s1,s2]) Out[6]: 0a 1b 0c 1d dtype:object In[7]:df1=pd.DataFrame([['a',1],['b',2]], ...:columns=['letter','number']) In[8]:df2=pd.DataFrame([['c',3],['d',4]], ...:columns=['letter','number']) In[9]:pd.concat([df1,df2]) Out[9]: letternumber 0a1 1b2 0c3 1d4横向连接

	
		In[10]:pd.concat([df1,df2],axis=1) Out[10]: letternumberletternumber 0a1c3 1b2d4默认情况下,concat是取并集,如果两个数据中有个数据没有对应行或列,则会填充为空值NaN合并交集

	
		In[11]:df3=pd.DataFrame([['c',3,'cat'],['d',4,'dog']], ...:columns=['letter','number','animal']) In[12]:df1 Out[12]: letternumber 0a1 1b2 In[13]:df3 Out[13]: letternumberanimal 0c3cat 1d4dog In[14]:pd.concat([df1,df3],join='inner') Out[14]: letternumber 0a1 1b2 0c3 1d4索引重置(不保留原有索引)

	
		In[15]:pd.concat([df1,df3],join='inner',ignore_index=True) Out[15]: letternumber 0a1 1b2 2c3 3d4 #以下方式和上述的输出结果等价 In[16]:pd.concat([df1,df3],join='inner').reset_index(drop=True) Out[16]: letternumber 0a1 1b2 2c3 3d4指定索引

	
		In[17]:pd.concat([df1,df3],keys=['df1','df3']) Out[17]: letternumberanimal df10a1NaN 1b2NaN df30c3cat 1d4dog In[18]:pd.concat([df1,df3],keys=['df1','df3'],names=['df名称','行ID']) Out[18]: letternumberanimal df名称行ID df10a1NaN 1b2NaN df30c3cat 1d4dog检测重复如果索引出现重复,则无法通过检测,会报错

	
		In[19]:pd.concat([df1,df3],verify_integrity=True) Traceback(mostrecentcalllast): ... ValueError:Indexeshaveoverlappingvalues:Int64Index([0,1],dtype='int64')合并并集下columns排序

	
		In[21]:pd.concat([df1,df3],sort=True) Out[21]: animalletternumber 0NaNa1 1NaNb2 0catc3 1dogd4DataFrame与Series合并

	
		In[22]:pd.concat([df1,s1]) Out[22]: letternumber0 0a1.0NaN 1b2.0NaN 0NaNNaNa 1NaNNaNb In[23]:pd.concat([df1,s1],axis=1) Out[23]: letternumber0 0a1a 1b2b #新增列一般可选以下两种方式 In[24]:df1.assign(新增列=s1) Out[24]: letternumber新增列 0a1a 1b2b In[25]:df1['新增列']=s1 In[26]:df1 Out[26]: letternumber新增列 0a1a 1b2b以上就concat函数方法的一些功能,相比之下,另外一个函数append也可以用于数据追加(纵向合并)
		
							

2. append

append主要用于追加数据,是比较简单直接的数据合并方式。

	
		df.append( other, ignore_index:'bool'=False, verify_integrity:'bool'=False, sort:'bool'=False, )->'DataFrame'在函数方法中,各参数含义如下:
other: 用于追加的数据,可以是DataFrameSeries或组成的列表ignore_index: 是否保留原有的索引verify_integrity: 检测索引是否重复,如果为True则有重复索引会报错sort: 并集合并方式下,对columns排序
接下来,我们就对该函数功能进行演示基础追加

	
		In[41]:df1.append(df2) Out[41]: letternumber 0a1 1b2 0c3 1d4 In[42]:df1.append([df1,df2,df3]) Out[42]: letternumberanimal 0a1NaN 1b2NaN 0a1NaN 1b2NaN 0c3NaN 1d4NaN 0c3cat 1d4dogcolumns重置(不保留原有索引)

	
		In[43]:df1.append([df1,df2,df3],ignore_index=True) Out[43]: letternumberanimal 0a1NaN 1b2NaN 2a1NaN 3b2NaN 4c3NaN 5d4NaN 6c3cat 7d4dog检测重复如果索引出现重复,则无法通过检测,会报错

	
		In[44]:df1.append([df1,df2],verify_integrity=True) Traceback(mostrecentcalllast): ... ValueError:Indexeshaveoverlappingvalues:Int64Index([0,1],dtype='int64')索引排序

	
		In[46]:df1.append([df1,df2,df3],sort=True) Out[46]: animalletternumber 0NaNa1 1NaNb2 0NaNa1 1NaNb2 0NaNc3 1NaNd4 0catc3 1dogd4追加Series

	
		In[49]:s=pd.Series({'letter':'s1','number':9}) In[50]:s Out[50]: letters1 number9 dtype:object In[51]:df1.append(s) Traceback(mostrecentcalllast): ... TypeError:CanonlyappendaSeriesifignore_index=TrueoriftheSerieshasaname In[53]:df1.append(s,ignore_index=True) Out[53]: letternumber 0a1 1b2 2s19追加字典这个在爬虫的时候比较好使,每爬取一条数据就合并到DataFrame类似数据中存储起来

	
		In[54]:dic={'letter':'s1','number':9} In[55]:df1.append(dic,ignore_index=True) Out[55]: letternumber 0a1 1b2 2s19
		
							

3. merge

merge函数方法类似SQL里的join,可以是pd.merge或者df.merge,区别就在于后者待合并的数据是

	
		pd.merge( left:'DataFrame|Series', right:'DataFrame|Series', how:'str'='inner', on:'IndexLabel|None'=None, left_on:'IndexLabel|None'=None, right_on:'IndexLabel|None'=None, left_index:'bool'=False, right_index:'bool'=False, sort:'bool'=False, suffixes:'Suffixes'=('_x','_y'), copy:'bool'=True, indicator:'bool'=False, validate:'str|None'=None, )->'DataFrame'在函数方法中,关键参数含义如下:
left: 用于连接的左侧数据right: 用于连接的右侧数据how: 数据连接方式,默认为 inner,可选outer、left和righton: 连接关键字段,左右侧数据中需要都存在,否则就用left_on和right_onleft_on: 左侧数据用于连接的关键字段right_on: 右侧数据用于连接的关键字段left_index: True表示左侧索引为连接关键字段right_index: True表示右侧索引为连接关键字段suffixes: 'Suffixes' = ('_x', '_y'),可以自由指定,就是同列名合并后列名显示后缀indicator: 是否显示合并后某行数据的归属来源
接下来,我们就对该函数功能进行演示基础合并

	
		In[55]:df1=pd.DataFrame({'key':['foo','bar','bal'], ...:'value2':[1,2,3]}) In[56]:df2=pd.DataFrame({'key':['foo','bar','baz'], ...:'value1':[5,6,7]}) In[57]:df1.merge(df2) Out[57]: keyvalue2value1 0foo15 1bar26其他连接方式

	
		In[58]:df1.merge(df2,how='left') Out[58]: keyvalue2value1 0foo15.0 1bar26.0 2bal3NaN In[59]:df1.merge(df2,how='right') Out[59]: keyvalue2value1 0foo1.05 1bar2.06 2bazNaN7 In[60]:df1.merge(df2,how='outer') Out[60]: keyvalue2value1 0foo1.05.0 1bar2.06.0 2bal3.0NaN 3bazNaN7.0 In[61]:df1.merge(df2,how='cross') Out[61]: key_xvalue2key_yvalue1 0foo1foo5 1foo1bar6 2foo1baz7 3bar2foo5 4bar2bar6 5bar2baz7 6bal3foo5 7bal3bar6 8bal3baz7指定连接键可以指定单个连接键,也可以指定多个连接键

	
		In[62]:df1=pd.DataFrame({'lkey1':['foo','bar','bal'], ...:'lkey2':['a','b','c'], ...:'value2':[1,2,3]}) In[63]:df2=pd.DataFrame({'rkey1':['foo','bar','baz'], ...:'rkey2':['a','b','c'], ...:'value2':[5,6,7]})  In[64]:df1 Out[64]: lkey1lkey2value2 0fooa1 1barb2 2balc3 In[65]:df2 Out[65]: rkey1rkey2value2 0fooa5 1barb6 2bazc7 In[66]:df1.merge(df2,left_on='lkey1',right_on='rkey1') Out[66]: lkey1lkey2value2_xrkey1rkey2value2_y 0fooa1fooa5 1barb2barb6 In[67]:df1.merge(df2,left_on=['lkey1','lkey2'],right_on=['rkey1','rkey2']) Out[67]: lkey1lkey2value2_xrkey1rkey2value2_y 0fooa1fooa5 1barb2barb6指定索引为键

	
		Out[68]:df1.merge(df2,left_index=True,right_index=True) Out[68]: lkey1lkey2value2_xrkey1rkey2value2_y 0fooa1fooa5 1barb2barb6 2balc3bazc7设置重复列后缀

	
		In[69]:df1.merge(df2,left_on='lkey1',right_on='rkey1',suffixes=['左','右']) Out[69]: lkey1lkey2value2左rkey1rkey2value2右 0fooa1fooa5 1barb2barb6连接指示新增一列用于显示数据来源

	
		In[70]:df1.merge(df2,left_on='lkey1',right_on='rkey1',suffixes=['左','右'],how='outer', ...:indicator=True ...:) Out[70]: lkey1lkey2value2左rkey1rkey2value2右_merge 0fooa1.0fooa5.0both 1barb2.0barb6.0both 2balc3.0NaNNaNNaNleft_only 3NaNNaNNaNbazc7.0right_only
		
							

4. join

join就有点想append之于concat,用于数据合并

	
		df.join( other:'FrameOrSeriesUnion', on:'IndexLabel|None'=None, how:'str'='left', lsuffix:'str'='', rsuffix:'str'='', sort:'bool'=False, )->'DataFrame'在函数方法中,关键参数含义如下:
other: 用于合并的右侧数据on: 连接关键字段,左右侧数据中需要都存在,否则就用left_on和right_onhow: 数据连接方式,默认为 inner,可选outer、left和rightlsuffix: 左侧同名列后缀rsuffix:右侧同名列后缀
接下来,我们就对该函数功能进行演示

	
		In[71]:df=pd.DataFrame({'key':['K0','K1','K2','K3','K4','K5'], ...:'A':['A0','A1','A2','A3','A4','A5']}) In[72]:other=pd.DataFrame({'key':['K0','K1','K2'], ...:'B':['B0','B1','B2']}) In[73]:df Out[73]: keyA 0K0A0 1K1A1 2K2A2 3K3A3 4K4A4 5K5A5 In[74]:other Out[74]: keyB 0K0B0 1K1B1 2K2B2 In[75]:df.join(other,on='key') Traceback(mostrecentcalllast): ... ValueError:Youaretryingtomergeonobjectandint64columns.Ifyouwishtoproceedyoushouldusepd.concat如果想用key关键字, 则需要key是索引。。。指定key

	
		In[76]:df.set_index('key').join(other.set_index('key')) Out[76]: AB key K0A0B0 K1A1B1 K2A2B2 K3A3NaN K4A4NaN K5A5NaN In[77]:df.join(other.set_index('key'),on='key') Out[77]: keyAB 0K0A0B0 1K1A1B1 2K2A2B2 3K3A3NaN 4K4A4NaN 5K5A5NaN指定重复列后缀

	
		In[78]:df.join(other,lsuffix='_左',rsuffix='右') Out[78]: key_左Akey右B 0K0A0K0B0 1K1A1K1B1 2K2A2K2B2 3K3A3NaNNaN 4K4A4NaNNaN 5K5A5NaNNaN其他参数就不多做介绍了,和merge基本一样。
		
							

5. combine

在数据合并的过程中,我们可能需要对对应位置的值进行一定的计算,pandas提供了combinecombine_first函数方法来进行这方面的合作操作。

	
		df.combine( other:'DataFrame', func, fill_value=None, overwrite:'bool'=True, )->'DataFrame'比如,数据合并的时候取单元格最小的值

	
		In[79]:df1=pd.DataFrame({'A':[0,0],'B':[4,4]}) In[80]:df2=pd.DataFrame({'A':[1,1],'B':[3,3]}) In[81]:df1 Out[81]: AB 004 104 In[82]:df2 Out[82]: AB 013 113 In[83]:take_smaller=lambdas1,s2:s1ifs1.sum()< s2.sum() elses2 In[84]:df1.combine(df2,take_smaller) Out[84]: AB 003 103 #也可以调用numpy的函数 In[85]:importnumpyasnp In[86]:df1.combine(df2,np.minimum) Out[86]: AB 003 103fill_value填充缺失值

	
		In[87]:df1=pd.DataFrame({'A':[0,0],'B':[None,4]}) In[87]:df2=pd.DataFrame({'A':[1,1],'B':[3,3]}) In[88]:df1 Out[88]: AB 00NaN 104.0 In[89]:df2 Out[89]: AB 013 113 In[90]:df1.combine(df2,take_smaller,fill_value=-88) Out[90]: AB 00-88.0 104.0overwrite=False保留

	
		In[91]:df1=pd.DataFrame({'A':[0,0],'B':[4,4]}) In[92]:df2=pd.DataFrame({'B':[3,3],'C':[-10,1],},index=[1,2]) In[93]:df1 Out[93]: AB 004 104 In[94]:df2 Out[94]: BC 13-10 231 In[95]:df1.combine(df2,take_smaller) Out[95]: ABC 0NaNNaNNaN 1NaN3.0-10.0 2NaN3.01.0 #保留A列原有的值 In[96]:df1.combine(df2,take_smaller,overwrite=False) Out[96]: ABC 00.0NaNNaN 10.03.0-10.0 2NaN3.01.0另外一个combine_first

	
		df.combine_first(other:'DataFrame')->'DataFrame'当df中元素为空采用other里的进行替换,结果为并集合并

	
		In[97]:df1=pd.DataFrame({'A':[None,0],'B':[None,4]}) In[98]:df2=pd.DataFrame({'A':[1,1],'B':[3,3]}) In[99]:df1 Out[99]: AB 0NaNNaN 10.04.0 In[100]:df2 Out[100]: AB 013 113 In[101]:df1.combine_first(df2) Out[101]: AB 01.03.0 10.04.0 In[102]:df1=pd.DataFrame({'A':[None,0],'B':[4,None]}) In[103]:df2=pd.DataFrame({'B':[3,3],'C':[1,1]},index=[1,2]) In[104]:df1 Out[104]: AB 0NaN4.0 10.0NaN In[105]:df2 Out[105]: BC 131 231 In[106]:df1.combine_first(df2) Out[106]: ABC 0NaN4.0NaN 10.03.01.0 2NaN3.01.0
		
							

总结

以上就本次介绍的关于Pandas数据合并的全部内容,相比之下我们可以发现:
  • append主要用于纵向追加数据,比较简单直接;
  • concat功能最强大,不仅可以纵向合并数据还可以横向合并数据而且支持很多其他条件设置;
  • merge则主要用于横向合并数据,类似SQL里的join连接;
  • join则比较简单,用于横向合并数据,条件相对苛刻;
  • combine更像是按照元素进行合并,根据一定的条件(函数规则)来进行数据合并。
审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6786

    浏览量

    88707
  • concat
    +关注

    关注

    0

    文章

    3

    浏览量

    1908

原文标题:5 个必须知道的 Pandas 数据合并技巧

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    贴片电阻应用须知

    贴片电阻应用须知
    的头像 发表于 10-16 09:47 177次阅读

    光于预充电阻的选型须知

    预充电阻的选型须知
    的头像 发表于 09-27 14:13 201次阅读

    半导体行业常用术语大全:30专业名词详解

    在半导体行业中,了解和掌握专业名词是至关重要的。这些名词不仅有助于我们更好地理解半导体的制造过程,还能提升我们在行业中的沟通效率。以下是半导体人必须知道的30专业名词的解释。
    的头像 发表于 06-14 10:47 8993次阅读
    半导体行业常用术语大全:30<b class='flag-5'>个</b>专业名词详解

    使用爱星物联IoT平台时,哪些参数配置是开发者必须知道的?

    hello,小伙伴们,上周我们《爱星物联IoT平台正式开源啦》,感兴趣的开发者可以点击文中的链接下载和体验。在使用爱星物联IoT平台之前,有哪些参数配置是嵌入式开发者必须配置的?小安带大家一起
    的头像 发表于 03-30 08:22 557次阅读
    使用爱星物联IoT平台时,哪些参数配置是开发者<b class='flag-5'>必须知道</b>的?

    强调:关于变频器,你必须知道的哪些事情?

    分类选型 1) 采用变频的目的:恒压控制或恒流控制等。 2) 变频器的负载类型:如叶片泵或容积泵等,特别注意负载的性能曲线,性能曲线决定了应用时的方式方法。 3) 变频器与负载的匹配问题: I.电压匹配:变频器的额定电压与负载的额定电压相符。 II. 电流匹配:普通的离心泵,变频器的额定电流与电机的额定电流相符。对于特殊的负载如深水泵等则需要参考电机性能参数,以最大电流确定变频器电流和过载能力。 III.转矩匹配:这种情况在恒转矩负
    的头像 发表于 03-11 08:39 460次阅读
    强调:关于变频器,你<b class='flag-5'>必须知道</b>的哪些事情?

    什么是HMI:你必须知道的定义、趋势与关键特性

    ,让操作人员或维护人员能够直接操作设备并进行监控。HMI系统通常能提供丰富的资讯,例如温度、压力、制造流程步骤以及材料的计量数据。还能显示设备中物料的确切位置或储存槽内的液位数据等讯息。无论是在制造业、能源管理还是其他自动化的重要行业领域,HMI都扮演着
    的头像 发表于 01-16 11:11 4774次阅读
    什么是HMI:你<b class='flag-5'>必须知道</b>的定义、趋势与关键特性

    学习FPGA必须知道的社区

    学习FPGA必须知道的社区
    的头像 发表于 01-03 17:51 335次阅读
    学习FPGA<b class='flag-5'>必须知道</b>的社区

    plc输入输出的运行原理

    plc输入端24v. 说明plc输入是PNP输入,要知道怎么接线必须知道plc输入输出的运行原理。
    发表于 12-17 09:27 1365次阅读
    plc输入输出的运行原理

    Python利用pandas读写Excel文件

    使用pandas模块读取Excel文件可以更为方便和快捷。pandas可以将Excel文件读取为一DataFrame对象,方便进行数据处理和分析。
    的头像 发表于 12-16 11:22 1232次阅读
    Python利用<b class='flag-5'>pandas</b>读写Excel文件

    POL负载点电源设计中有何诀窍?有两点很关键,你必须知道

    POL负载点电源设计中有何诀窍?有两点很关键,你必须知道
    的头像 发表于 12-06 16:06 1850次阅读
    POL负载点电源设计中有何诀窍?有两点很关键,你<b class='flag-5'>必须知道</b>

    电阻的秘密——你必须知道的电阻参数

    电阻的秘密——你必须知道的电阻参数
    的头像 发表于 12-06 14:31 790次阅读
    电阻的秘密——你<b class='flag-5'>必须知道</b>的电阻参数

    使用pandas进行数据选择和过滤的基本技术和函数

    Python pandas库提供了几种选择和过滤数据的方法,如loc、iloc、[]括号操作符、query、isin、between等等
    的头像 发表于 12-01 10:14 318次阅读
    使用<b class='flag-5'>pandas</b>进行<b class='flag-5'>数据</b>选择和过滤的基本技术和函数

    关于头盔耳机,这些事你必须知道

    和误解,下面就来一一为大家解答。 一:骑行戴头盔耳机会影响安全吗? 可能很多人觉得骑车戴耳机会分散注意力,是危险的行为,但实际上戴头盔蓝牙耳机并没有你想象中的危险。 因为头盔耳机是一款非入耳式的蓝牙耳机,对骑行
    的头像 发表于 11-22 17:41 1527次阅读

    pcb菲林是什么?这5作用你知道

    pcb菲林是什么?这5作用你知道
    的头像 发表于 11-22 11:14 7328次阅读

    如何实现Pandas的DataFrame转换交互式表格

    Pivottablejs是一通过IPython widgets集成到Python中的JavaScript库,允许用户直接从DataFrame数据创建交互式和灵活的汇总报表。可以进行高效、清晰的数据分析和表示,帮助将
    的头像 发表于 11-21 16:15 771次阅读
    如何实现<b class='flag-5'>Pandas</b>的DataFrame转换交互式表格