Pandas merge()–合并两个DataFrame对象

时间:2020-02-23 14:42:08  来源:igfitidea点击:

Pandas DataFrame merge()函数用于通过数据库样式的合并操作合并两个DataFrame对象。
连接是对列或者索引执行的。

如果对列进行了连接,则索引将被忽略。
此函数返回一个新的DataFrame,而源DataFrame对象不变。

Pandas DataFrame merge()函数语法

merge()函数的语法为:

def merge(
  self,
  right,
  how="inner",
  on=None,
  left_on=None,
  right_on=None,
  left_index=False,
  right_index=False,
  sort=False,
  suffixes=("_x", "_y"),
  copy=True,
  indicator=False,
  validate=None,
)
  • 右:另一个与源DataFrame合并的DataFrame。

  • 方式:{"左","右","外部","内部"},默认为"内部"。
    这是定义合并操作类型的最重要参数。
    这些类似于SQL左外部联接,右外部联接,完全外部联接和内部联接。

  • on:要加入的列或者索引级别名称。
    这些列必须同时存在于两个DataFrame中。
    如果未提供,则使用两个DataFrame中列的交集。

  • left_on:要在左侧DataFrame中加入的列或者索引级别名称。

  • right_on:要在右侧DataFrame中加入的列或者索引级别名称。

  • left_index:使用左侧DataFrame中的索引作为连接键。

  • right_index:使用右侧DataFrame中的索引作为连接键。

  • sort:在结果DataFrame中按字典顺序对联接键进行排序。

  • 后缀:后缀分别应用于左侧和右侧的重叠列名称。

  • 指标:如果为True,则在输出数据帧中添加一列,称为" _merge",其中包含有关每一行源的信息。

  • validate:用于验证合并过程。
    有效值为{" one_to_one"或者" 1:1"," one_to_many"或者" 1:m"," many_to_one"或者" m:1"," many_to_many"或者" m:m"}。

Pandas DataFrame merge()示例

让我们看一些合并两个DataFrame对象的示例。

1.默认合并–内部联接

import pandas as pd

d1 = {'Name': ['hyman', 'Meghna', 'Lisa'], 'Country': ['San Franceco', 'San Franceco', 'USA'], 'Role': ['CEO', 'CTO', 'CTO']}

df1 = pd.DataFrame(d1)

print('DataFrame 1:\n', df1)

df2 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['hyman', 'Anupam', 'Amit']})
print('DataFrame 2:\n', df2)

df_merged = df1.merge(df2)
print('Result:\n', df_merged)

输出:

DataFrame 1:
    Name Country Role
0  hyman   San Franceco  CEO
1  Meghna   San Franceco  CTO
2    Lisa     USA  CTO
DataFrame 2:
  ID    Name
0   1  hyman
1   2  Anupam
2   3    Amit
Result:
    Name Country Role  ID
0  hyman   San Franceco  CEO   1

2.使用左,右和外部联接合并数据框

print('Result Left Join:\n', df1.merge(df2, how='left'))
print('Result Right Join:\n', df1.merge(df2, how='right'))
print('Result Outer Join:\n', df1.merge(df2, how='outer'))

输出:

Result Left Join:
    Name Country Role   ID
0  hyman   San Franceco  CEO  1.0
1  Meghna   San Franceco  CTO  NaN
2    Lisa     USA  CTO  NaN
Result Right Join:
    Name Country Role  ID
0  hyman   San Franceco  CEO   1
1  Anupam     NaN  NaN   2
2    Amit     NaN  NaN   3
Result Outer Join:
    Name Country Role   ID
0  hyman   San Franceco  CEO  1.0
1  Meghna   San Franceco  CTO  NaN
2    Lisa     USA  CTO  NaN
3  Anupam     NaN  NaN  2.0
4    Amit     NaN  NaN  3.0

3.在特定列上合并DataFrame

import pandas as pd

d1 = {'Name': ['hyman', 'Meghna', 'Lisa'], 'ID': [1, 2, 3], 'Country': ['San Franceco', 'San Franceco', 'USA'],
    'Role': ['CEO', 'CTO', 'CTO']}
df1 = pd.DataFrame(d1)

df2 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['hyman', 'Anupam', 'Amit']})

print(df1.merge(df2, on='ID'))
print(df1.merge(df2, on='Name'))

输出:

Name_x  ID Country Role  Name_y
0  hyman   1   San Franceco  CEO  hyman
1  Meghna   2   San Franceco  CTO  Anupam
2    Lisa   3     USA  CTO    Amit

   Name  ID_x Country Role  ID_y
0  hyman     1   San Franceco  CEO     1

4.指定用于合并DataFrame对象的左列和右列

import pandas as pd

d1 = {'Name': ['hyman', 'Meghna', 'Lisa'], 'ID1': [1, 2, 3], 'Country': ['San Franceco', 'San Franceco', 'USA'],
    'Role': ['CEO', 'CTO', 'CTO']}
df1 = pd.DataFrame(d1)

df2 = pd.DataFrame({'ID2': [1, 2, 3], 'Name': ['hyman', 'Anupam', 'Amit']})

print(df1.merge(df2))

print(df1.merge(df2, left_on='ID1', right_on='ID2'))

输出;

Name  ID1 Country Role  ID2
0  hyman    1   San Franceco  CEO    1

 Name_x  ID1 Country Role  ID2  Name_y
0  hyman    1   San Franceco  CEO    1  hyman
1  Meghna    2   San Franceco  CTO    2  Anupam
2    Lisa    3     USA  CTO    3    Amit

5.使用索引作为合并数据帧的联接键

import pandas as pd

d1 = {'Name': ['hyman', 'Meghna', 'Lisa'], 'Country': ['San Franceco', 'San Franceco', 'USA'], 'Role': ['CEO', 'CTO', 'CTO']}
df1 = pd.DataFrame(d1)

df2 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['hyman', 'Anupam', 'Amit']})

df_merged = df1.merge(df2)
print('Result Default Merge:\n', df_merged)

df_merged = df1.merge(df2, left_index=True, right_index=True)
print('\nResult Index Merge:\n', df_merged)

输出:

Result Default Merge:
    Name Country Role  ID
0  hyman   San Franceco  CEO   1

Result Index Merge:
  Name_x Country Role  ID  Name_y
0  hyman   San Franceco  CEO   1  hyman
1  Meghna   San Franceco  CTO   2  Anupam
2    Lisa     USA  CTO   3    Amit