开发者

pandas数据的合并concat()和merge()方式

目录
  • concat() 轴向连接
    • 合并
      • (1) join='outer',axis=0
      • (2)join='outer',axis=1
      • (3) join=inner, axis=0
  • merge() 融合
    • inner(内连接)
      • outer (外连接)
        • left(左连接)
          • right (右连接)
          • 应用场景
            • 总结
              import pandas as pd
              
              • 轴向连接(concatenation): pd.concat() 可以沿一个轴将多个DataFrame对象连接在一起, 形成一个新的Dataframe对象
              • 融合(merging):pd.merge()方法可以根据一个或多个键将不同DataFrame中的行连接起来。

              concat() 轴向连接

              concat() 函数可以将数据根据不同的轴作进行合并

              pd.concat(objs, axis=0, join='outer')
              • objs: series、dataframe或者是panel构成的序列list
              • axis: 需要合并链接的轴,0是行,1是列,默认是0
              • join:连接的方式 inner,或者outer,默认是outer

              准备数据

              dict1={
                  'A': ['A0', 'A1', 'A2', 'A3'],
                  'B': ['B0', 'B1', 'B2', 'B3'],
                  'C': ['C0', 'C1', 'C2', 'C3']}
              df1=pd.DataFrame(dict1)
              print(df1)
              
              dict2={
                  'B': ['B0', 'B1', 'B2', 'B3'],
                  'Cpython': ['C0', 'C1', 'C2', 'C3'],
                  'D': ['D0', 'D1', 'D2', 'D3']}
              df2=pd.DataFrame(dict2)
              print(df2)
              

              合并

              join的值 inner ,得到的是两表的交集,如果是outer,得到的是两表的并集

              (1) join='outer',axis=0

              • 当join=‘outer’,axis参数为0时,列进行并集处理,纵向表拼接,缺失值由NaN填充,并且会保留原有数据的行索引
              pd.concat([df1, df2], axis=0, join='outer', sort=True) # 我没加 sort=True 会报一个警告
              

              pandas数据的合并concat()和merge()方式

              ABCD
              0A0B0C0NaN
              1A1B1C1NaN
              2A2B2C2NaN
              3A3B3C3NaN
              0NaNB0C0D0
              1NaNB1C1D1
              2NaNB2C2D2
              3NaNB3C3D3
              • 如果两个表的index都没有实际含义, 使用ignore_index参数置为 true, 重新生成一个新的index
              pd.concat([df1,df2],axis=0,join='outer',ignore_index=True, sort=True) # 我没加 sortjs=True 会报一个警告
              
              ABCD
              0A0B0C0NaN
              1A1B1C1NaN
              2A2B2C2NaN
              3A3B3C3NaN
              4NaNB0C0D0
              5NaNB1C1D1
              6NaNB2C2D2
              7NaNB3C3D3

              (2)join='outer',axis=1

              • 当join=‘outer’,axis参数为1时,行进行并集处理,横向表拼接,缺失值由NaN填充

              pandas数据的合并concat()和merge()方式

              pd.concat([df1,df2],axis=1,join='outer', sort=True) # 我没加 sort=True 会报一个警告
              
              ABCBCD
              0A0B0C0B0C0D0
              1A1B1C1B1C1D1
              2A2B2C2B2C2D2
              3A3B3C3B3C3D3

              (3) join=inner, axis=0

              javascript
              pd.concat([df1,df2],axis=0,join='inner',ignore_index=True)
              

              pandas数据的合并concat()和merge()方式

              BC
              0B0C0
              1B1C1
              2B2C2
              3B3C3
              4B0C0
              5B1C1
              6B2C2
              7B3C3

              merge() 融合

              merge(left, right, how='inner', on=None)
              

              参数介绍

              • left和right, 两个要合并的DataFrame(对应的左连接和右连接)
              • how: 连接的方式, 有inner(内连接)、left(左连接)、right(右连接)、outer(外连接), 默认为 inner
              • on: 指的是用于连接的列索引名称, 必须存在于左右两个DataFrame中, 如果没有指定且其他参数也没有指定,则两个DataFrame列名交集作为连接键
              import pandas as pd
              left = pd.DataFrame({'key':['a','b','b','d'],'data1':range(4)})
              print(left)
              
              right = pd.DataFrame({'key':['a','b','c'],'data2':range(3)})
              print(right)
              
                key  data1
              0   a      0
              1   b      1
              2   b      2
              3   d      3
                key  data2
              0   a      0
              1   b      1
              2   c      2
              

              inner(内连接)

              • merge()默认做inner连接,并且使用两个DataFrame的列名交集(key)作为连接键,同样,最终连接的数据也是两个DataFramekey列数据的交集

              pandas数据的合并concat()和merge()方式

              pd.merge(left,right)
              
              keydata1data2
              0a00
              1b11
              2b21

              outer (外连接)

              • 当merge()做outer连接时最终连接的数据是两个DataFraTNBsGmekey列数据的并集,缺失的内容由NaN填充
              pd.merge(left,right,on=['key'],how='outer')
              

              pandas数据的合并concat()和merge()方式

              keydata1data2
              0a0.00.0
              1b1.01.0
              2b2.01.0
              3d3.0NaN
              4cNaN2.0

              left(左连接)

              • 当merge()做left连接时,最终连接的数据将以left数据的链接建为准合并两个数据的列数据,缺失的内容由NaN填充

              pandas数据的合并concat()和merge()方式

              pd.merge(left,right,on=['key'],how='left')
              
              keydata1data2
              0a00.0
              1b11.0
              2b21.0
              3d3NaN

              right (右连接)

              • 当merge()做right连接时,最终连接的数据将以right数据的链接建为准合并两个数据的列数据,缺失的内容由NaN填充
              pd.merge(left,right,on=['key'],how='编程客栈right')
              
              keydata1data2
              0a0.00
              1b1.01
              2b2.01
              3cNaN2

              应用场景

              例如:

              • 现在有两张表格分别存储了9月和10月份的成交信息,
              • 那么这个时候我们就可以使用concat( )将两个表沿着0轴合并

              例如:

              • 现在有两张表格,一个是成交信息,包含订单号、金额、客户ID等信息;
              • 第二个是客户信息,包含客户ID、姓名、电话号等信息,那么这个时候我们就可以使用merge()根据客户ID将两个表合并成一个完整的表

              总结

              以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

              0

              上一篇:

              下一篇:

              精彩评论

              暂无评论...
              验证码 换一张
              取 消

              最新开发

              开发排行榜