Python merge、concat用法

Python merge、concat用法

Python merge、concat用法

在进行数据分析和处理的过程中,我们经常需要对多个数据集进行合并或者拼接操作。Python的pandas库提供了merge()concat()函数来满足这种需求。本文将详细介绍这两个函数的用法和常见应用场景。

1. merge函数

merge()函数用于合并两个DataFrame对象。合并的依据可以是一个或多个列名,将相同列名的数据进行合并。可以类比SQL中的JOIN操作。

1.1 基本用法

语法如下:

pandas.merge(left, 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)
  • leftright是要合并的两个DataFrame。
  • how参数用于指定合并的方式,可选值为innerouterleftright
  • on参数用于指定合并的列名,如果两个DataFrame有相同的列名,则只需要一个列名。
  • left_onright_on参数分别用于指定左右DataFrame的合并列。
  • left_indexright_index参数分别用于指定左右DataFrame以索引作为合并列。
  • suffixes参数用于指定当合并两个DataFrame有相同列名时,合并后的列名后缀。

下面是一个简单的示例:

import pandas as pd

# 创建示例数据
data1 = {'ID': ['001', '002', '003', '004'],
         'Name': ['Alice', 'Bob', 'Charlie', 'David'],
         'Age': [25, 30, 35, 40]}
df1 = pd.DataFrame(data1)

data2 = {'ID': ['002', '003', '004', '005'],
         'Sex': ['Female', 'Male', 'Male', 'Female'],
         'Country': ['USA', 'China', 'UK', 'Canada']}
df2 = pd.DataFrame(data2)

# 使用merge函数合并两个DataFrame
df_merged = pd.merge(df1, df2, on='ID')
print(df_merged)

运行结果如下:

    ID     Name  Age     Sex Country
0  002      Bob   30  Female     USA
1  003  Charlie   35    Male   China
2  004    David   40    Male      UK

1.2 合并方式

how参数用于指定合并的方式。常见的合并方式有:

  • inner:默认方式,取两个DataFrame的交集。
  • outer:取两个DataFrame的并集,缺失数据部分用NaN填充。
  • left:以左边的DataFrame为准,取左边DataFrame的全部数据和右边DataFrame的交集部分。
  • right:以右边的DataFrame为准,取右边DataFrame的全部数据和左边DataFrame的交集部分。

下面是一个示例:

import pandas as pd

# 创建示例数据
data1 = {'ID': ['001', '002', '003', '004'],
         'Name': ['Alice', 'Bob', 'Charlie', 'David'],
         'Age': [25, 30, 35, 40]}
df1 = pd.DataFrame(data1)

data2 = {'ID': ['002', '003', '004', '005'],
         'Sex': ['Female', 'Male', 'Male', 'Female'],
         'Country': ['USA', 'China', 'UK', 'Canada']}
df2 = pd.DataFrame(data2)

# 使用不同的合并方式合并两个DataFrame
df_inner = pd.merge(df1, df2, on='ID', how='inner')
df_outer = pd.merge(df1, df2, on='ID', how='outer')
df_left = pd.merge(df1, df2, on='ID', how='left')
df_right = pd.merge(df1, df2, on='ID', how='right')

# 输出合并结果
print("Inner Merge:")
print(df_inner)
print("\nOuter Merge:")
print(df_outer)
print("\nLeft Merge:")
print(df_left)
print("\nRight Merge:")
print(df_right)

运行结果如下:

Inner Merge:
    ID     Name  Age     Sex Country
0  002      Bob   30  Female     USA
1  003  Charlie   35    Male   China
2  004    David   40    Male      UK

Outer Merge:
    ID     Name   Age     Sex Country
0  001    Alice  25.0     NaN     NaN
1  002      Bob  30.0  Female     USA
2  003  Charlie  35.0    Male   China
3  004    David  40.0    Male      UK
4  005      NaN   NaN  Female  Canada

Left Merge:
    ID     Name  Age     Sex Country
0  001    Alice   25     NaN     NaN
1  002      Bob   30  Female     USA
2  003  Charlie   35    Male   China
3  004    David   40    Male      UK

Right Merge:
    ID     Name   Age     Sex Country
0  002      Bob  30.0  Female     USA
1  003  Charlie  35.0    Male   China
2  004    David  40.0    Male      UK
3  005      NaN   NaN  Female  Canada

1.3 处理重复列名

当两个DataFrame进行合并时,如果有相同的列名,可以通过suffixes参数指定合并后的列名的后缀。示例如下:

import pandas as pd

# 创建示例数据
data1 = {'ID': ['001', '002', '003', '004'],
         'Name': ['Alice', 'Bob', 'Charlie', 'David'],
         'Age': [25, 30, 35, 40]}
df1 = pd.DataFrame(data1)

data2 = {'ID': ['002', '003', '004', '005'],
         'Name': ['Bob', 'Charlie', 'David', 'Eva'],
         'Country': ['USA', 'China', 'UK', 'Canada']}
df2 = pd.DataFrame(data2)

# 使用suffixes参数指定合并后的列名后缀
df_merged = pd.merge(df1, df2, on='ID', suffixes=('_left', '_right'))
print(df_merged)

运行结果如下:

    ID Name_left  Age Name_right Country
0  002       Bob   30        Bob     USA
1  003   Charlie   35    Charlie   China
2  004     David   40      David      UK

2. concat函数

concat()函数用于沿指定轴将多个DataFrame对象连接在一起。连接的方式可以是行方向(垂直连接)或列方向(水平连接)。类似于SQL中的UNION和JOIN操作。

2.1 基本用法

语法如下:

pandas.concat(objs, axis=0, join='outer', 
              ignore_index=False, keys=None, 
              levels=None, names=None, 
              verify_integrity=False, sort=False, 
              copy=True)
  • objs是要连接的DataFrame对象组成的列表。
  • axis参数用于指定连接的方向,0表示沿着行方向连接,1表示沿着列方向连接。
  • join参数用于指定连接的方式,可选值为innerouter
  • ignore_index参数用于重置索引,如果为True,则会生成一个新的索引。
  • keys参数用于指定连接后的层次化索引。
  • sort参数用于指定是否按照索引排序。

下面是一个简单的示例:

import pandas as pd

# 创建示例数据
data1 = {'ID': ['001', '002', '003', '004'],
         'Name': ['Alice', 'Bob', 'Charlie', 'David'],
         'Age': [25, 30, 35, 40]}
df1 = pd.DataFrame(data1)

data2 = {'ID': ['005', '006', '007', '008'],
         'Name': ['Eva', 'Frank', 'Grace', 'Henry'],
         'Age': [45, 50, 55, 60]}
df2 = pd.DataFrame(data2)

# 使用concat函数水平连接两个DataFrame
df_concat_h = pd.concat([df1, df2], axis=1)
print(df_concat_h)

运行结果如下:

    ID     Name  Age   ID   Name  Age
0  001    Alice   25  005    Eva   45
1  002      Bob   30  006  Frank   50
2  003  Charlie   35  007  Grace   55
3  004    David   40  008  Henry   60

2.2 连接方式

join参数用于指定连接的方式。常见的连接方式有:

  • inner:默认方式,取所有DataFrame的交集。
  • outer:取所有DataFrame的并集,缺失数据部分用NaN填充。

下面是一个示例:

import pandas as pd

# 创建示例数据
data1 = {'ID': ['001', '002', '003', '004'],
         'Name': ['Alice', 'Bob', 'Charlie', 'David'],
         'Age': [25, 30, 35, 40]}
df1 = pd.DataFrame(data1)

data2 = {'ID': ['003', '004', '005', '006'],
         'Name': ['Charlie', 'David', 'Eva', 'Frank'],
         'Age': [35, 40, 45, 50]}
df2 = pd.DataFrame(data2)

# 使用不同的连接方式连接两个DataFrame
df_inner = pd.concat([df1, df2], join='inner')
df_outer = pd.concat([df1, df2], join='outer')

# 输出连接结果
print("Inner Join:")
print(df_inner)
print("\nOuter Join:")
print(df_outer)

运行结果如下:

Inner Join:
    ID     Name  Age
0  001    Alice   25
1  002      Bob   30
2  003  Charlie   35
3  004    David   40
0  003  Charlie   35
1  004    David   40

Outer Join:
    ID     Name  Age
0  001    Alice   25
1  002      Bob   30
2  003  Charlie   35
3  004    David   40
0  003  Charlie   35
1  004    David   40
2  005      Eva   45
3  006    Frank   50

2.3 处理重复索引列

如果连接的DataFrame有重复的索引列,可以通过ignore_index参数重置索引。示例如下:

import pandas as pd

# 创建示例数据
data1 = {'ID': ['001', '002', '003', '004'],
         'Name': ['Alice', 'Bob', 'Charlie', 'David'],
         'Age': [25, 30, 35, 40]}
df1 = pd.DataFrame(data1)

data2 = {'ID': ['003', '004', '005', '006'],
         'Name': ['Charlie', 'David', 'Eva', 'Frank'],
         'Age': [35, 40, 45, 50]}
df2 = pd.DataFrame(data2)

# 使用ignore_index参数重置索引
df_concat = pd.concat([df1, df2], ignore_index=True)
print(df_concat)

运行结果如下:

    ID     Name  Age
0  001    Alice   25
1  002      Bob   30
2  003  Charlie   35
3  004    David   40
4  003  Charlie   35
5  004    David   40
6  005      Eva   45
7  006    Frank   50

总结

本文介绍了Python中pandas库中merge()concat()函数的用法和常见应用场景。merge()函数用于合并两个DataFrame对象,类似于SQL中的JOIN操作,可以指定合并的方式和合并的列名。concat()函数用于连接多个DataFrame对象,可以沿着行方向或列方向进行连接,也可以指定连接的方式和重置索引。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程