畅游数据海洋,巧用DataFrame多表合并拼接
2023-10-16 08:47:31
在数据分析领域,我们经常需要对来自不同数据源或表格的数据进行合并和拼接,以获得更加全面和深入的洞察。而作为数据分析利器的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_