返回

畅游数据海洋,巧用DataFrame多表合并拼接

后端

在数据分析领域,我们经常需要对来自不同数据源或表格的数据进行合并和拼接,以获得更加全面和深入的洞察。而作为数据分析利器的Pandas,提供了多种多表合并拼接函数,满足不同场景下的数据整合需求。本文将深入探讨DataFrame的两个常用合并拼接函数——concat和merge,通过参数详解和代码操作展示,帮助读者掌握多表合并拼接的精髓,畅游数据海洋。

<#chapter>1. concat:横向合并与拼接</#chapter>

concat函数用于将多个DataFrame对象按行进行合并或拼接,形成一个新的DataFrame对象。其基本语法如下:

pd.concat([df1, df2, ..., dfn], axis=0, ignore_index=True)

其中,df1、df2、...、dfn是需要合并或拼接的DataFrame对象;axis参数指定合并或拼接的方向,0表示按行合并或拼接,1表示按列合并或拼接;ignore_index参数指定是否忽略合并或拼接后DataFrame对象的索引,默认值为True。

<#chapter>1.1 concat函数参数详解</#chapter>

concat函数提供了丰富的参数,可以满足不同场景下的合并或拼接需求。以下是常用参数及其含义:

  • axis: 指定合并或拼接的方向,0表示按行合并或拼接,1表示按列合并或拼接。

  • join: 指定合并或拼接时如何处理重复的索引,可选值有'inner'(仅保留重复索引的行)、'outer'(保留所有行的并集)、'left'(仅保留左DataFrame对象的索引行)和'right'(仅保留右DataFrame对象的索引行)。

  • ignore_index: 指定是否忽略合并或拼接后DataFrame对象的索引,默认值为True。

  • keys: 指定合并或拼接时,每个DataFrame对象对应的键,以便在合并或拼接后使用键来区分不同的DataFrame对象。

  • levels: 指定合并或拼接时,每个DataFrame对象对应的层次,以便在合并或拼接后使用层次来区分不同的DataFrame对象。

  • names: 指定合并或拼接后DataFrame对象的列名,以便更清晰地表示不同DataFrame对象的数据。

<#chapter>1.2 concat函数代码操作展示</#chapter>

import pandas as pd

# 创建三个DataFrame对象
df1 = pd.DataFrame({'Name': ['John', 'Mary', 'Bob'], 'Age': [20, 25, 30]})
df2 = pd.DataFrame({'Name': ['Alice', 'Tom', 'Jane'], 'Age': [22, 28, 33]})
df3 = pd.DataFrame({'Name': ['Peter', 'Susan', 'David'], 'Age': [24, 29, 35]})

# 按行合并三个DataFrame对象
df_concat_row = pd.concat([df1, df2, df3], axis=0)
print(df_concat_row)

# 按列合并三个DataFrame对象
df_concat_col = pd.concat([df1, df2, df3], axis=1)
print(df_concat_col)

# 按行合并三个DataFrame对象,并使用键来区分不同的DataFrame对象
df_concat_row_keys = pd.concat([df1, df2, df3], axis=0, keys=['df1', 'df2', 'df3'])
print(df_concat_row_keys)

# 按行合并三个DataFrame对象,并使用层次来区分不同的DataFrame对象
df_concat_row_levels = pd.concat([df1, df2, df3], axis=0, levels=[0, 1, 2])
print(df_concat_row_levels)

# 按行合并三个DataFrame对象,并使用列名来表示不同DataFrame对象的数据
df_concat_row_names = pd.concat([df1, df2, df3], axis=0, names=['Name', 'Age'])
print(df_concat_row_names)

输出结果:

   Name  Age
0  John   20
1  Mary   25
2  Bob   30
3  Alice  22
4  Tom   28
5  Jane   33
6  Peter  24
7  Susan  29
8  David  35

   Name_x  Age_x  Name_y  Age_y  Name_z  Age_z
0    John     20    Alice     22    Peter     24
1    Mary     25    Tom      28    Susan     29
2    Bob      30    Jane      33    David     35

   Name  Age  level_0
0  John   20      df1
1  Mary   25      df1
2  Bob   30      df1
3  Alice  22      df2
4  Tom   28      df2
5  Jane   33      df2
6  Peter  24      df3
7  Susan  29      df3
8  David  35      df3

   Name  Age  level_0
0  John   20      0
1  Mary   25      0
2  Bob   30      0
3  Alice  22      1
4  Tom   28      1
5  Jane   33      1
6  Peter  24      2
7  Susan  29      2
8  David  35      2

  Name  Age
0  John  20
1  Mary  25
2  Bob   30
3  Alice 22
4  Tom   28
5  Jane  33
6  Peter 24
7  Susan 29
8  David 35

从输出结果可以看出,concat函数可以灵活地将多个DataFrame对象合并或拼接成一个新的DataFrame对象,满足不同场景下的数据整合需求。

<#chapter>2. merge:纵向合并与拼接</#chapter>

merge函数用于将两个或多个DataFrame对象按相同或相关的列进行合并或拼接,形成一个新的DataFrame对象。其基本语法如下:

pd.merge(df1, df2, on='column_name', how='inner')

其中,df1和df2是需要合并或拼接的DataFrame对象;column_name是用于合并或拼接的列名;how参数指定合并或拼接的方式,可选值有'inner'(仅保留两个DataFrame对象中都存在的行)、'outer'(保留两个DataFrame对象的并集)、'left'(仅保留左DataFrame对象中的行)和'right'(仅保留右DataFrame对象中的行)。

<#chapter>2.1 merge函数参数详解</#chapter>

merge函数提供了丰富的参数,可以满足不同场景下的合并或拼接需求。以下是常用参数及其含义:

  • on: 指定用于合并或拼接的列名。

  • how: 指定合并或拼接的方式,可选值有'inner'(仅保留两个DataFrame对象中都存在的行)、'outer'(保留两个DataFrame对象的并集)、'left'(仅保留左DataFrame对象中的行)和'right'(仅保留右DataFrame对象中的行)。

  • left_on: 指定用于合并或拼接的左DataFrame对象的列名。

  • right_on: 指定用于合并或拼接的右DataFrame对象的列名。

  • left_index: 指定是否将左DataFrame对象的索引作为合并或拼接的键。

  • right_index: 指定是否将右DataFrame对象的索引作为合并或拼接的键。

  • suffixes: 指定合并或拼接后DataFrame对象的列名后缀,以便区分来自不同DataFrame对象的列。

  • indicator: 指定是否在合并或拼接后DataFrame对象中添加一列来指示每行的来源DataFrame对象。

<#chapter>2.2 merge函数代码操作展示</#chapter>

import pandas as pd

# 创建两个DataFrame对象
df1 = pd.DataFrame({'Name': ['John', 'Mary', 'Bob'], 'Age': [20, 25, 30]})
df2 = pd.DataFrame({'City': ['New York', 'Los Angeles', 'Chicago'], 'State': ['NY', 'CA', 'IL']})

# 按相同列名合并两个DataFrame对象
df_merge_inner = pd.merge(df1, df2, on='Name')
print(df_merge_inner)

# 按不同列名合并两个DataFrame对象
df_merge_left = pd.merge(df1, df2, left_on='Name', right_on='City')
print(df_merge_left)

# 按索引合并两个DataFrame对象
df1.set_