Panda数据合并3种方式

2023-07-12  本文已影响0人  逍遥_yjz

1. 数据连接merge

    Python中merge()函数的表连接功能类似于Excel中实现拼接的vlookup()函数,也**类似于关系型数据库**的连接方式。merge()可以根据一个或多个键(列值)将不同的DataFrame连接起来。该函数的典型应用场景是,两张不同字段的表存在相同的键,根据键整合到一张表里面。

语法:

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)

参数介绍:

参数key 对应含义及值
left和right 两个不同的DataFrame
how 连接方式,有inner、left、right、outer,默认为inner
on 指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键
left_on 左侧DataFrame中用于连接键的列名,这个参数左右列名不同但代表的含义相同时非常的有用
right_on 右侧DataFrame中用于连接键的列名
left_index 使用左侧DataFrame中的行索引作为连接键
right_index 使用右侧DataFrame中的行索引作为连接键
sort 默认为True,将合并的数据进行排序,设置为False可以提高性能
suffixes 字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x', '_y')
copy 默认为True,总是将数据复制到数据结构中,设置为False可以提高性能
indicator 显示合并数据中数据的来源情况

几种连接方式:

用参数how来指明具体的连接方式,除了内连接(inner)还有左连接(left)、右连接(right)、外连接(outer)。效果如下图:

# 1. 单值key连接
# merge的默认的表连接方式是内连接
pd.merge(df1, df2,on='Key') 

pd.merge(df1, df2,on='Key' , how='left')
pd.merge(df1, df2,on='Key' , how='right')

# 2.多键连接时将连接键组成列表传入
pd.merge(df1,df2,on=['key1','key2'], how='outer')
         
# 3.如果两个对象的列名不同,可以使用left_on,right_on分别指定
#   key1 是左表的列名,key3是右表的列名
pd.merge(left,df3,left_on='key1',right_on='key3')
  1. 索引(多对应一)
df1 = pd.DataFrame(
    {
        "A": ["A0", "A1", "A2", "A3"],
      "B": ["B0", "B1", "B2", "B3"],
        "C": ["C0", "C1", "C2", "C3"],
       "D": ["D0", "D1", "D2", "D3"],
   },
  index=[0, 1, 1, 3],
)

df2 = pd.DataFrame(
   {
       "E": ["D4", "D5", "D6", "D7"],
  },
   index=[0, 1, 2, 3],
)
# 一对应多
df_merge = pd.merge(df1, df2, left_index=True, right_index=True,how='right')
print(df_merge)
     A    B    C    D   E
0   A0   B0   C0   D0  D4
1   A1   B1   C1   D1  D5
1   A2   B2   C2   D2  D5
2  NaN  NaN  NaN  NaN  D6
3   A3   B3   C3   D3  D7
# 多拼接一
df_merge = pd.merge(df1, df2, left_index=True, right_index=True,how='left')
print(df_merge)
    A   B   C   D   E
0  A0  B0  C0  D0  D4
1  A1  B1  C1  D1  D5
1  A2  B2  C2  D2  D5
3  A3  B3  C3  D3  D7

# 以下因为索引问题会报错,这是一个区别
pd.concat([df1, df2],axis=1)

2. 数据合并-concat

沿着一条轴,将多个对象堆叠到一起

语法:

pd.concat(objs,axis=0,join=’outer’,join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,sort=None,copy=True)

pd.concat()只是单纯的把两个表拼接在一起,参数axis是关键,它用于指定合并的轴是行还是列,axis默认是0(纵向拼接)。

参数介绍:

参数key 对应含义及值
objs 需要连接的对象集合,一般是列表或字典
axis 连接轴向
join 参数为‘outer’或‘inner’
ignore_index=True 重建索引
df1 = pd.DataFrame(
    {
        "A": ["A0", "A1", "A2", "A3"],
        "B": ["B0", "B1", "B2", "B3"],
        "C": ["C0", "C1", "C2", "C3"],
        "D": ["D0", "D1", "D2", "D3"],
    },
    index=[0, 1, 2, 3],
)

df2 = pd.DataFrame(
    {
        "E": ["D4", "D5", "D6", "D7"],
    },
    index=[0, 1, 2, 3],
)
concatenated_df = pd.concat([df1, df2],axis=1,join='outer')
print(concatenated_df)
'''
    A   B   C   D   E
0  A0  B0  C0  D0  D4
1  A1  B1  C1  D1  D5
2  A2  B2  C2  D2  D6
3  A3  B3  C3  D3  D7
'''
concatenated_df = pd.concat([df1, df2], axis=0, join='outer')
print(concatenated_df)
'''
     A    B    C    D    E
0   A0   B0   C0   D0  NaN
1   A1   B1   C1   D1  NaN
2   A2   B2   C2   D2  NaN
3   A3   B3   C3   D3  NaN
0  NaN  NaN  NaN  NaN   D4
1  NaN  NaN  NaN  NaN   D5
2  NaN  NaN  NaN  NaN   D6
3  NaN  NaN  NaN  NaN   D7
'''

为避免如上所示的索引重复(从 0 到 3 的索引在串联数据框中出现两次),请使用如下所示的 ignore_index=True

concatenated_df = pd.concat([df1, df2], axis=0,ignore_index = True, join='outer')
print(concatenated_df)
'''
     A    B    C    D    E
0   A0   B0   C0   D0  NaN
1   A1   B1   C1   D1  NaN
2   A2   B2   C2   D2  NaN
3   A3   B3   C3   D3  NaN
4  NaN  NaN  NaN  NaN   D4
5  NaN  NaN  NaN  NaN   D5
6  NaN  NaN  NaN  NaN   D6
7  NaN  NaN  NaN  NaN   D7
'''

3. join

语法:

join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False):

其参数的意义与merge方法中的参数意义基本一样。该方法最为简单,主要用于索引上的合并。

3.1 正常的索引连接

df1 = pd.DataFrame(
    {
        "A": ["A0", "A1", "A2", "A3"],
        "B": ["B0", "B1", "B2", "B3"],
        "C": ["C0", "C1", "C2", "C3"],
        "D": ["D0", "D1", "D2", "D3"],
    },
    index=[0, 1, 2, 3],
)

df2 = pd.DataFrame(
    {
        "E": ["D4", "D5", "D6", "D7"],
    },
    index=[0, 1, 2, 3],
)
# 默认 how="left"
join_df = df1.join(df2)
print(join_df)
'''
    A   B   C   D   E
0  A0  B0  C0  D0  D4
1  A1  B1  C1  D1  D5
2  A2  B2  C2  D2  D6
3  A3  B3  C3  D3  D7
'''

3.2 多对一的索引连接

在这里可以看到能达到merge效果

df1 = pd.DataFrame(
    {
        "A": ["A0", "A1", "A2", "A3"],
        "B": ["B0", "B1", "B2", "B3"],
        "C": ["C0", "C1", "C2", "C3"],
        "D": ["D0", "D1", "D2", "D3"],
    },
    index=[0, 1, 1, 1],
)

df2 = pd.DataFrame(
    {
        "E": ["D4", "D5", "D6", "D7"],
    },
    index=[0, 1, 2, 3],
)
# 默认 how="left"
join_df = df1.join(df2)
print(join_df)
'''
    A   B   C   D   E
0  A0  B0  C0  D0  D4
1  A1  B1  C1  D1  D5
1  A2  B2  C2  D2  D5
1  A3  B3  C3  D3  D5
'''

3.3 索引有共同也有独立

df1 = pd.DataFrame(
    {
        "A": ["A0", "A1", "A2", "A3"],
        "B": ["B0", "B1", "B2", "B3"],
        "C": ["C0", "C1", "C2", "C3"],
        "D": ["D0", "D1", "D2", "D3"],
    },
    index=[0, 1, 1, 4],
)

df2 = pd.DataFrame(
    {
        "E": ["D4", "D5", "D6", "D7"],
    },
    index=[0, 1, 2, 3],
)
# 默认 how="left"
join_df = df1.join(df2,how='outer')
print(join_df)
'''
     A    B    C    D    E
0   A0   B0   C0   D0   D4
1   A1   B1   C1   D1   D5
1   A2   B2   C2   D2   D5
2  NaN  NaN  NaN  NaN   D6
3  NaN  NaN  NaN  NaN   D7
4   A3   B3   C3   D3  NaN
'''

# 测试concat
print(pd.concat([df1, df2]))
'''
     A    B    C    D    E
0   A0   B0   C0   D0  NaN
1   A1   B1   C1   D1  NaN
1   A2   B2   C2   D2  NaN
4   A3   B3   C3   D3  NaN
0  NaN  NaN  NaN  NaN   D4
1  NaN  NaN  NaN  NaN   D5
2  NaN  NaN  NaN  NaN   D6
3  NaN  NaN  NaN  NaN   D7
'''
print(pd.concat([df1, df2],join='inner'))
''' 空数据
Empty DataFrame
Columns: []
Index: [0, 1, 1, 4, 0, 1, 2, 3]
'''

3.4 利用列为索引

df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': [5, 6, 7, 8]})

joined_df = df1.join(df2.set_index('key'), on='key', how='outer', rsuffix='_y')
print(joined_df)
'''
    key  value  value_y
0.0   A    1.0      NaN
1.0   B    2.0      5.0
2.0   C    3.0      NaN
3.0   D    4.0      6.0
NaN   E    NaN      7.0
NaN   F    NaN      8.0
'''

4. 总结

注:只有merge和join才能对应索引连接,并且索引是多对一关系

concat函数和merge函数表连接的区别是:

1、concat函数既可以实现横向拼接也可以实现纵向拼接,merge函数只能进行横向连接

2、concat函数可以对多表进行操作,merge函数只能操作两张表

3、concat函数只能单纯的表拼接,只按索引拼接不查找公共列,merge可以按照键进行拼接。

可以看到,使用join方法得到的结果与使用merge方法得到的结果相同。不同之处在于,使用join方法时需要先将一个数据集的索引设置为要合并的列,而使用merge方法时则需要指定要合并的列名。

上一篇下一篇

猜你喜欢

热点阅读