📅  最后修改于: 2023-12-03 15:08:45.439000             🧑  作者: Mango
数据分析经常需要将若干个数据集进行合并,形成一个更完整的数据,本文将介绍在 Python 中如何合并两个以上的数据帧。
我们将使用以下三个数据集进行合并:
import pandas as pd
# 创建数据帧1
df1 = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 40]
})
# 创建数据帧2
df2 = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'income': [5000, 6000, 7000, 8000]
})
# 创建数据帧3
df3 = pd.DataFrame({
'name': ['Alice', 'Charlie', 'David', 'Edward'],
'gender': ['F', 'M', 'M', 'M']
})
三个数据集分别是 df1
、df2
、df3
,每个数据集都包含一个 name
字段。df1
包含一个 age
字段,df2
包含一个 income
字段,df3
包含一个 gender
字段。
横向合并(horizontal merge)将两个或多个数据集沿着横轴方向(即列方向)进行连接。在 Pandas 中,可以使用 merge()
函数来实现横向合并。
下面的代码通过 merge()
函数将 df1
和 df2
横向合并:
merged_df = pd.merge(df1, df2, on='name')
print(merged_df)
输出结果为:
name age income
0 Alice 25 5000
1 Bob 30 6000
2 Charlie 35 7000
3 David 40 8000
上述代码中的 on
参数指定了合并关键字,它指定了两个数据集中用于合并的共同字段。
将三个数据集横向合并的代码如下:
merged_df = pd.merge(pd.merge(df1, df2, on='name'), df3, on='name', how='outer')
print(merged_df)
输出结果为:
name age income gender
0 Alice 25.0 5000.0 F
1 Bob 30.0 6000.0 NaN
2 Charlie 35.0 7000.0 M
3 David 40.0 8000.0 M
4 Edward NaN NaN M
上述代码中的 how
参数指定了合并方式,它可以取值为 inner
(内连接)、outer
(外连接)、left
(左连接)和 right
(右连接)。在本例中,我们使用了 outer
连接,这意味着数据集中任何一个数据集中包含的 name
字段都将被包含在合并后的数据集中。
纵向合并(vertical merge)将两个或多个数据集沿着纵轴方向(即行方向)进行连接。在 Pandas 中,可以使用 concat()
函数来实现纵向合并。
下面的代码通过 concat()
函数将 df1
、df2
和 df3
纵向合并:
merged_df = pd.concat([df1, df2, df3], axis=1)
print(merged_df)
输出结果为:
name age name income name gender
0 Alice 25 Alice 5000 Alice F
1 Bob 30 Bob 6000 Charlie M
2 Charlie 35 Charlie 7000 David M
3 David 40 David 8000 Edward M
注意,由于 df1
、df2
和 df3
的 name
字段不完全相同,因此在将这三个数据集纵向合并时,可能会出现一些缺失值(NaN)。如果希望合并后的数据集中不包含缺失值,可以使用 fillna()
函数来对缺失值进行处理。
将三个数据集纵向合并并去除缺失值的代码如下:
merged_df = pd.concat([df1.set_index('name'), df2.set_index('name'), df3.set_index('name')], axis=1).reset_index()
merged_df = merged_df.fillna('')
print(merged_df)
输出结果如下:
name age income gender
0 Alice 25 5000 F
1 Bob 30 6000
2 Charlie 35 7000 M
3 David 40 8000 M
4 Edward M
在上述代码中,set_index()
函数将 name
字段设置为索引,以便能够在纵向合并时对它们进行对齐。reset_index()
函数将索引还原为普通列;fillna('')
函数将缺失值替换为空字符串。