Pandas-高级处理(一):DataFrame多表联合【join:直接通过“索引”来连接2个DF】【merge:通过“自定义外键”来连接2个DF】【inner、left、right、outer】

Pandas具有全功能的,高性能内存中连接操作,与SQL等关系数据库非常相似

一、join:直接通过“索引”链接合并2个DataFrame

x.join(self, other, on=None, how="left", lsuffix="", rsuffix="", sort=False) -> DataFrame

1、案例01

import numpy as np
import pandas as pd

# pd.join() → 直接通过索引链接

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'])
print("left = \n", left)
print('-' * 100)
print("right = \n", right)
print('-' * 200)

x1 = left.join(right)
print("x1 = \n", x1)
print('-' * 100)
# 等价于:pd.merge(left, right, left_index=True, right_index=True, how='outer')
x2 = left.join(right, how='outer')
print("x2 = \n", x2)
print('-' * 200)

打印结果:

left = 
      A   B
K0  A0  B0
K1  A1  B1
K2  A2  B2
----------------------------------------------------------------------------------------------------
right = 
      C   D
K0  C0  D0
K2  C2  D2
K3  C3  D3
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x1 = 
      A   B    C    D
K0  A0  B0   C0   D0
K1  A1  B1  NaN  NaN
K2  A2  B2   C2   D2
----------------------------------------------------------------------------------------------------
x2 = 
       A    B    C    D
K0   A0   B0   C0   D0
K1   A1   B1  NaN  NaN
K2   A2   B2   C2   D2
K3  NaN  NaN   C3   D3
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Process finished with exit code 0

2、案例02

import numpy as np
import pandas as pd

# pd.join() → 直接通过索引链接

left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A4'],
                     'B': ['B0', 'B1', 'B2', 'B4']},
                    index=['K0', 'K1', 'K2', 'K4'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3']},
                     index=['K0', 'K2', 'K3'])
print("left = \n", left)
print('-' * 100)
print("right = \n", right)
print('-' * 200)

x1 = left.join(right)
print("x1 = \n", x1)
print('-' * 100)
# 等价于:pd.merge(left, right, left_index=True, right_index=True, how='outer')
x2 = left.join(right, how='outer')
print("x2 = \n", x2)
print('-' * 200)

打印结果:

left = 
      A   B
K0  A0  B0
K1  A1  B1
K2  A2  B2
K4  A4  B4
----------------------------------------------------------------------------------------------------
right = 
      C
K0  C0
K2  C2
K3  C3
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x1 = 
      A   B    C
K0  A0  B0   C0
K1  A1  B1  NaN
K2  A2  B2   C2
K4  A4  B4  NaN
----------------------------------------------------------------------------------------------------
x2 = 
       A    B    C
K0   A0   B0   C0
K1   A1   B1  NaN
K2   A2   B2   C2
K3  NaN  NaN   C3
K4   A4   B4  NaN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Process finished with exit code 0

3、x1连接x2的某一列

import pandas as pd

# pd.join() → 直接通过索引链接

df1 = pd.DataFrame({'key': list('bbacaab'),
                    'data1': [1, 3, 2, 4, 5, 9, 7]})
df2 = pd.DataFrame({'key': list('abd'),
                    'date2': [11, 2, 33]})
print("df1 = \n", df1)
print('-' * 100)
print("df2 = \n", df2)
print('-' * 200)

# df1只连接df2的date2列
df3 = df2['date2']
print("df3 = \n{0}\n type(df3) = {1}".format(df3, type(df3)))
print('-' * 100)

x2 = df1.join(df2['date2'])
print("x2 = \n", x2)
print('-' * 200)

打印结果:

df1 = 
   key  data1
0   b      1
1   b      3
2   a      2
3   c      4
4   a      5
5   a      9
6   b      7
----------------------------------------------------------------------------------------------------
df2 = 
   key  date2
0   a     11
1   b      2
2   d     33
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
df3 = 
0    11
1     2
2    33
Name: date2, dtype: int64
 type(df3) = <class 'pandas.core.series.Series'>
----------------------------------------------------------------------------------------------------
x2 = 
   key  data1  date2
0   b      1   11.0
1   b      3    2.0
2   a      2   33.0
3   c      4    NaN
4   a      5    NaN
5   a      9    NaN
6   b      7    NaN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Process finished with exit code 0

二、merge:通过“自定义外键”链接合并2个DataFrame

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)

  • 可以指定按照两组数据的共同键值对合并或者左右各自
  • left: DataFrame
  • right: 另一个DataFrame
  • on: 指定的共同键
  • how:按照什么方式连接
  • left_on, right_on, left_index, right_index :当连接键不为相同的列时,可以单独设置左键与右键
Merge methodSQL Join NameDescription
leftLEFT OUTER JOINUse keys from left frame only
rightRIGHT OUTER JOINUse keys from right frame only
outerFULL OUTER JOINUse union of keys from both frames
innerINNER JOINUse intersection of keys from both frames
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']})
import pandas as pd

# pd.join() → 直接通过索引链接

df1 = pd.DataFrame({'key': list('bbacaab'),
                    'data1': [1, 3, 2, 4, 5, 9, 7]})
df2 = pd.DataFrame({'key': list('abd'),
                    'date2': [11, 2, 33]})
print("df1 = \n", df1)
print('-' * 100)
print("df2 = \n", df2)
print('-' * 200)

# 以相同的键 'key' 为外键
x1 = pd.merge(df1, df2)  # 默认 inner方式
print("x1 = \n", x1)
print('-' * 200)

# 开启 left_index=True, right_index=True 之后,默认 suffixes=('_x', '_y')
x2 = pd.merge(df1, df2, left_index=True, right_index=True, suffixes=('_x', '_y'))
print("x2 = \n", x2)
print('-' * 200)

# 开启 left_index=True, right_index=True 之后,默认 suffixes=('_x', '_y')
x3 = pd.merge(df1, df2, left_index=True, right_index=True, how='outer', suffixes=('_x', '_y'))
print("x3 = \n", x3)
print('-' * 200)

打印结果:

df1 = 
   key  data1
0   b      1
1   b      3
2   a      2
3   c      4
4   a      5
5   a      9
6   b      7
----------------------------------------------------------------------------------------------------
df2 = 
   key  date2
0   a     11
1   b      2
2   d     33
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x1 = 
   key  data1  date2
0   b      1      2
1   b      3      2
2   b      7      2
3   a      2     11
4   a      5     11
5   a      9     11
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x2 = 
   key_x  data1 key_y  date2
0     b      1     a     11
1     b      3     b      2
2     a      2     d     33
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x3 = 
   key_x  data1 key_y  date2
0     b      1     a   11.0
1     b      3     b    2.0
2     a      2     d   33.0
3     c      4   NaN    NaN
4     a      5   NaN    NaN
5     a      9   NaN    NaN
6     b      7   NaN    NaN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Process finished with exit code 0

1、内连接(默认内连接)

inner:默认,取交集

# 默认内连接
result = pd.merge(left, right, on=['key1', 'key2'])

在这里插入图片描述

2、左连接

left:按照左表为参考合并,数据缺失范围NaN

result = pd.merge(left, right, how='left', on=['key1', 'key2'])

在这里插入图片描述

3、右连接

right:按照右表为参考合并,数据缺失范围NaN

result = pd.merge(left, right, how='right', on=['key1', 'key2'])

在这里插入图片描述

4、外链接

outer:取并集,数据缺失范围NaN

result = pd.merge(left, right, how='outer', on=['key1', 'key2'])

在这里插入图片描述

5、参数:left_on、right_on、left_index、right_index

当连接键不为相同的列时,单独设置左键&右键

import numpy as np
import pandas as pd

# 参数 left_on, right_on, left_index, right_index → 当连接键不为相同的列时,单独设置左键&右键

df1 = pd.DataFrame({'lkey': list('bbacaab'),
                    'data1': range(7)})
df2 = pd.DataFrame({'rkey': list('abd'),
                    'date2': range(3)})

print("df1 = \n", df1)
print('-' * 100)
print("df2 = \n", df2)
print('-' * 200)

# df1以‘lkey’为键,df2以‘rkey’为键
data1 = pd.merge(df1, df2, left_on='lkey', right_on='rkey')
print("data1 = \n", data1)
print('-' * 200)

df1 = pd.DataFrame({'key': list('abcdfeg'),
                    'data1': range(7)})
df2 = pd.DataFrame({'date2': range(100, 105)},
                   index=list('abcde'))

# df1以‘key’为键,df2以index为键
# left_index:为True时,第一个df以index为键,默认False
# right_index:为True时,第二个df以index为键,默认False
# 所以 left_on, right_on, left_index, right_index可以相互组合:left_on + right_on, left_on + right_index, left_index + right_on, left_index + right_index
data2 = pd.merge(df1, df2, left_on='key', right_index=True)
print("data2 = \n", data2)
print('-' * 200)

打印结果:

df1 = 
   lkey  data1
0    b      0
1    b      1
2    a      2
3    c      3
4    a      4
5    a      5
6    b      6
----------------------------------------------------------------------------------------------------
df2 = 
   rkey  date2
0    a      0
1    b      1
2    d      2
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
data1 = 
   lkey  data1 rkey  date2
0    b      0    b      1
1    b      1    b      1
2    b      6    b      1
3    a      2    a      0
4    a      4    a      0
5    a      5    a      0
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
data2 = 
   key  data1  date2
0   a      0    100
1   b      1    101
2   c      2    102
3   d      3    103
5   e      5    104
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Process finished with exit code 0

5、参数:sort

import pandas as pd

# 参数 sort

df1 = pd.DataFrame({'key': list('bbacaab'),
                    'data1': [1, 3, 2, 4, 5, 9, 7]})
df2 = pd.DataFrame({'key': list('abd'),
                    'date2': [11, 2, 33]})
print("df1 = \n", df1)
print('-' * 100)
print("df2 = \n", df2)
print('-' * 200)

x1 = pd.merge(df1, df2, on='key', how='outer')
print("x1 = \n", x1)
print('-' * 100)
# sort:按照字典顺序通过 连接键 对结果DataFrame进行排序。默认为False,设置为False会大幅提高性能
x2 = pd.merge(df1, df2, on='key', how='outer', sort=True)
print("x2 = \n", x2)
print('-' * 100)

# 也可直接用Dataframe的排序方法:sort_values,sort_index
x3 = x2.sort_values('data1')
print("x3 = \n", x3)
print('-' * 200)

打印结果:

df1 = 
   key  data1
0   b      1
1   b      3
2   a      2
3   c      4
4   a      5
5   a      9
6   b      7
----------------------------------------------------------------------------------------------------
df2 = 
   key  date2
0   a     11
1   b      2
2   d     33
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x1 = 
   key  data1  date2
0   b    1.0    2.0
1   b    3.0    2.0
2   b    7.0    2.0
3   a    2.0   11.0
4   a    5.0   11.0
5   a    9.0   11.0
6   c    4.0    NaN
7   d    NaN   33.0
----------------------------------------------------------------------------------------------------
x2 = 
   key  data1  date2
0   a    2.0   11.0
1   a    5.0   11.0
2   a    9.0   11.0
3   b    1.0    2.0
4   b    3.0    2.0
5   b    7.0    2.0
6   c    4.0    NaN
7   d    NaN   33.0
----------------------------------------------------------------------------------------------------
x3 = 
   key  data1  date2
3   b    1.0    2.0
0   a    2.0   11.0
4   b    3.0    2.0
6   c    4.0    NaN
1   a    5.0   11.0
5   b    7.0    2.0
2   a    9.0   11.0
7   d    NaN   33.0
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Process finished with exit code 0

6、参数:suffixes=(‘_x’, ‘_y’)

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: pandas是一个强大的Python数据分析库,其提供了各种操作数据的功能,包括合并多个DataFramemerge()函数是pandas中一个非常常用的合并数据的方法。 首先,假设有两个DataFramedf1和df2,它们包含不同的数据列和索引。我们可以使用merge()方法将它们合并成一个新的DataFramemerge()函数的基本语法如下: merged_df = pd.merge(df1, df2, on='列名') 其中,df1和df2是待合并的两个DataFrame对象,on='列名'表示根据该列进行合并。如果两个DataFrame的该列数据相等,则合并这两行数据。可以设置参数how来指定合并方式,包括inner、outerleftright,默认为inner(内连接)。 例如,如果df1中有列A和列B,df2中有列A和列C,我们可以使用如下代码合并它们: merged_df = pd.merge(df1, df2, on='A') 合并后的新DataFrame merged_df 将包含df1和df2的所有列,并且根据列A的数据进行合并。 除了根据列进行合并外,还可以根据索引进行合并。只需将on参数设置为None,然后使用left_index和right_index指定要合并索引列。 例如,如果我们要根据索引合并df1和df2,可以使用如下代码: merged_df = pd.merge(df1, df2, left_index=True, right_index=True) 这样,合并后的新DataFrame merged_df 将根据索引进行合并,包含df1和df2的所有列。 综上所述,pandas中的merge()函数为我们提供了一种简便的方法来合并多个DataFrame。我们可以根据指定的列或索引进行合并,并通过设置不同的合并方式来控制结果。这使得我们能够轻松地处理和分析大量的数据。 ### 回答2: pandas是一个用于数据分析和数据操作的Python库。其中的merge函数可以用于合并多个DataFrame。下面是如何使用merge函数合并多个DataFrame的步骤: 1. 导入pandas库:首先,需要导入pands库,以便使用其中的merge函数。通常,pandas库已经被安装在Python环境中。 ```python import pandas as pd ``` 2. 创建要合并DataFrame:准备需要合并的多个DataFrame。每个DataFrame可以包含一些共享的列或不同的列。 ```python df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) df2 = pd.DataFrame({'A': [1, 2, 3], 'C': [7, 8, 9]}) df3 = pd.DataFrame({'A': [1, 2, 3], 'D': [10, 11, 12]}) ``` 3. 使用merge函数合并DataFrame:使用merge函数将多个DataFrame合并为一个DataFrame。在此过程中,可以指定一些参数,如连接键和合并方式。 ```python merged_df = pd.merge(df1, df2, on='A', how='inner') merged_df = pd.merge(merged_df, df3, on='A', how='inner') ``` 上述代码将df1、df2和df3按'A'这一列进行内连接合并合并后的DataFrame将包含'A'列以及df1、df2和df3中的其他列。 4. 查看合并后的结果:可以使用head()或tail()函数查看合并后的结果的前几行或后几行。 ```python print(merged_df.head()) ``` 通过执行上述代码,将显示合并后的DataFrame的前几行。 以上是使用pandasmerge函数合并多个DataFrame的基本步骤。可以根据具体的需求,调整参数来实现不同的合并方式,如左连接、右连接、外连接等。 ### 回答3: pandas 中的 merge() 函数可以用于合并多个 DataFrame合并是根据指定的一列或多列进行的,并且类似于 SQL 中的 JOIN 操作。下面是一个简单的例子来说明如何使用 merge()。 假设我们有两个 DataFramedf1 和 df2。df1 包含员工的姓名和员工编号,而 df2 包含员工编号和员工的职位信息。我们想要根据员工编号将这两个 DataFrame 合并起来,创建一个新的 DataFrame,其中包含员工的姓名、员工编号和职位信息。 首先,我们使用 merge() 函数将 df1 和 df2 按照员工编号进行合并merged_df = pd.merge(df1, df2, on='员工编号') 在这里,我们将 df1 和 df2 通过员工编号这一列进行合并,并将结果保存在 merged_df 中。 如果 df1 和 df2 中的列名不同,我们可以使用 left_on 和 right_on 参数来指定要进行合并的列名: merged_df = pd.merge(df1, df2, left_on='df1员工编号', right_on='df2员工编号') 此外,还可以使用 merge() 函数的 how 参数来指定合并的方式,如 'left'、'right'、'inner' 或 'outer'。默认情况下,merge() 函数使用 'inner' 合并方式,即只保留两个 DataFrame 中共有的数据。不过,我们也可以使用其他合并方式来合并数据。 通过使用 merge() 函数,我们可以方便地将多个 DataFrame 进行合并,根据不同的需求生成一个新的 DataFrame。希望这个回答能对你有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值