python数据可视化 十一 Python数据分析入门:数据合并

数据合并(pd.merge)

  • 根据单个或多个键将不同DataFrame的行连接起来
  • 类似数据库的连接操作
  • pd.merge:(left, right, how='inner',on=None,left_on=None, right_on=None )
    left:合并时左边的DataFrame
    right:合并时右边的DataFrame
    how:合并的方式,默认'inner', 'outer', 'left', 'right'
    on:需要合并的列名,必须两边都有的列名,并以 left 和 right 中的列名的交集作为连接键
    left_on: left Dataframe中用作连接键的列
    right_on: right Dataframe中用作连接键的列
  • 内连接 inner:对两张表都有的键的交集进行联合

python数据可视化 十一 Python数据分析入门:数据合并

文章插图
  • 全连接 outer:对两者表的都有的键的并集进行联合


    python数据可视化 十一 Python数据分析入门:数据合并

    文章插图
  • 左连接 left:对所有左表的键进行联合


    python数据可视化 十一 Python数据分析入门:数据合并

    文章插图
  • 右连接 right:对所有右表的键进行联合


    python数据可视化 十一 Python数据分析入门:数据合并

    文章插图

    示例代码:
import pandas as pdimport numpy as npleft = 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']})pd.merge(left,right,on='key') #指定连接键key运行结果:
keyABCD0K0A0B0C0D01K1A1B1C1D12K2A2B2C2D23K3A3B3C3D3
python数据可视化 十一 Python数据分析入门:数据合并

文章插图
示例代码:
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']})pd.merge(left,right,on=['key1','key2']) #指定多个键,进行合并运行结果:
key1key2ABCD0K0K0A0B0C0D01K1K0A2B2C1D12K1K0A2B2C2D2
python数据可视化 十一 Python数据分析入门:数据合并

文章插图
#指定左连接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']})pd.merge(left, right, how='left', on=['key1', 'key2'])key1key2ABCD0K0K0A0B0C0D01K0K1A1B1NaNNaN2K1K0A2B2C1D13K1K0A2B2C2D24K2K1A3B3NaNNaN
python数据可视化 十一 Python数据分析入门:数据合并

文章插图
#指定右连接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']})pd.merge(left, right, how='right', on=['key1', 'key2'])key1key2ABCD0K0K0A0B0C0D01K1K0A2B2C1D12K1K0A2B2C2D23K2K0NaNNaNC3D3
python数据可视化 十一 Python数据分析入门:数据合并

文章插图
默认是“内连接”(inner),即结果中的键是交集
how指定连接方式
“外连接”(outer),结果中的键是并集示例代码:
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']})pd.merge(left,right,how='outer',on=['key1','key2'])运行结果:
key1key2ABCD0K0K0A0B0C0D01K0K1A1B1NaNNaN2K1K0A2B2C1D13K1K0A2B2C2D24K2K1A3B3NaNNaN5K2K0NaNNaNC3D3
python数据可视化 十一 Python数据分析入门:数据合并

文章插图
处理重复列名参数suffixes:默认为_x, _y
示例代码:
# 处理重复列名df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],'data' : np.random.randint(0,10,7)})df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],'data' : np.random.randint(0,10,3)})print(pd.merge(df_obj1, df_obj2, on='key', suffixes=('_left', '_right')))运行结果:
data_left keydata_right09b115b121b132a842a855a8按索引连接参数left_index=True或right_index=True
示例代码:
# 按索引连接df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],'data1' : np.random.randint(0,10,7)})df_obj2 = pd.DataFrame({'data2' : np.random.randint(0,10,3)}, index=['a', 'b', 'd'])print(pd.merge(df_obj1, df_obj2, left_on='key', right_index=True))运行结果:
data1 keydata203b614b668b626a043a050a0数据合并(pd.concat)沿轴方向将多个对象合并到一起
1. NumPy的concatnp.concatenate
示例代码:
import numpy as npimport pandas as pdarr1 = np.random.randint(0, 10, (3, 4))arr2 = np.random.randint(0, 10, (3, 4))print(arr1)print(arr2)print(np.concatenate([arr1, arr2]))print(np.concatenate([arr1, arr2], axis=1))运行结果:
# print(arr1)[[3 3 0 8] [2 0 3 1] [4 8 8 2]]# print(arr2)[[6 8 7 3] [1 6 8 7] [1 4 7 1]]# print(np.concatenate([arr1, arr2])) [[3 3 0 8] [2 0 3 1] [4 8 8 2] [6 8 7 3] [1 6 8 7] [1 4 7 1]]# print(np.concatenate([arr1, arr2], axis=1)) [[3 3 0 8 6 8 7 3] [2 0 3 1 1 6 8 7] [4 8 8 2 1 4 7 1]]2. pd.concat
  • 注意指定轴方向,默认axis=0
  • join指定合并方式,默认为outer
  • Series合并时查看行索引有无重复
【python数据可视化 十一 Python数据分析入门:数据合并】df1 = pd.DataFrame(np.arange(6).reshape(3,2),index=list('abc'),columns=['one','two'])df2 = pd.DataFrame(np.arange(4).reshape(2,2)+5,index=list('ac'),columns=['three','four'])pd.concat([df1,df2]) #默认外连接,axis=0fouronethreetwoaNaN0.0NaN1.0bNaN2.0NaN3.0cNaN4.0NaN5.0a6.0NaN5.0NaNc8.0NaN7.0NaNpd.concat([df1,df2],axis='columns') #指定axis=1连接onetwothreefoura015.06.0b23NaNNaNc457.08.0#同样我们也可以指定连接的方式为innerpd.concat([df1,df2],axis=1,join='inner')onetwothreefoura0156c4578