Pandas 如何合并两个数据框
在本文中,我们将介绍如何使用Pandas将两个数据框进行合并。一个数据框(Dataframe)通常代表一个二维表格,其中包含行和列,每行表示不同的实例或数据点,每列表示这些实例或数据点的不同属性。将两个数据框合并在一起通常需要满足两个数据框有相同的列或索引作为依据。
阅读更多:Pandas 教程
连接数据框
Pandas中提供了多种方法可以将两个或多个数据框连接在一起,这些方法通常包括连接类型和连接键(连接列或索引)。常见的连接类型包括左连接(left join)、右连接(right join)、内连接(inner join)和外连接(outer join)。使用连接键连接数据框时,需要保证连接键在两个数据框中的取值唯一。
横向合并
横向合并是将两个数据框沿着列方向进行合并。在Pandas中,可以使用concat函数实现这一功能。concat函数默认执行的是纵向合并,但设置参数axis=1后则表示进行横向合并。以下是一个示例:
import pandas as pd
# 创建两个数据框
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
# 横向合并数据框
result = pd.concat([df1, df2], axis=1)
print(result)
输出结果为:
A B C D A B C D
0 A0 B0 C0 D0 NaN NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN NaN
2 A2 B2 C2 D2 NaN NaN NaN NaN
3 A3 B3 C3 D3 NaN NaN NaN NaN
4 NaN NaN NaN NaN A4 B4 C4 D4
5 NaN NaN NaN NaN A5 B5 C5 D5
6 NaN NaN NaN NaN A6 B6 C6 D6
7 NaN NaN NaN NaN A7 B7 C7 D7
从输出结果可以看出,通过concat函数将两个数据框横向合并后,相同的列名都被保留了,但并非必须使用相同的列名。此外,即使两个数据框并不完全相同,使用concat函数合并时,缺失数据将以NaN(Not a Number)的形式填充。
纵向合并
纵向合并是将两个数据框沿着行方向进行合并。类似于横向合并,Pandas中也可以使用concat函数将多个数据框纵向合并。以下是一个示例:
import pandas as pd
# 创建两个数据框
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
# 纵向合并数据框
result = pd.concat([df1, df2], axis=0, ignore_index=True)
print(result)
输出结果为:
key A B C D
0 K0 A0 B0 NaN NaN
1 K1 A1 B1 NaN NaN
2 K2 A2 B2 NaN NaN
3 K3 A3 B3 NaN NaN
4 K0 NaN NaN C0 D0
5 K1 NaN NaN C1 D1
6 K2 NaN NaN C2 D2
7 K3 NaN NaN C3 D3
从输出结果可以看出,使用concat函数将两个数据框纵向合并后,相同的列名被保留,行索引也会被保留。如果要重新设置行索引,可以使用参数ignore_index=True来实现。
合并数据
合并数据是将两个数据框根据某个列或索引进行匹配,然后将匹配的数据合并到一起。Pandas中提供了许多方法来进行数据合并,其中包括join、merge和concat等函数。以下是这些函数的简要说明:
- join函数:在列方向(axis=1)上将两个数据框进行合并,使用索引作为连接键进行合并;
- merge函数:使用指定的列(或索引)作为连接键,将两个数据框进行合并;
- concat函数:在列方向或行方向沿着指定的轴进行合并。
由于数据合并的方法比较多,下面将分别介绍这些函数的使用方法:
join函数
join函数的语法格式如下:
DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
其中,参数other表示要合并的另一个数据框,on表示指定的连接键(可以是列名或索引),how表示连接类型(包括left、right、inner和outer),lsuffix和rsuffix分别表示连接相同列名时在列名后添加的后缀(如果不需要添加后缀则留空),sort表示是否对结果按照连接键进行排序(默认为False)。
以下是一个示例:
import pandas as pd
# 创建两个数据框
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
# 使用join函数合并数据框
result = df1.join(df2.set_index('key'), on='key')
print(result)
输出结果为:
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
从输出结果可以看出,使用join函数将两个数据框在列方向上进行合并后得到了一个新的数据框,同时A、B、C和D这四列数据也都被保留了。在这个例子中,连接键是key列,并且df1是左数据框,df2是右数据框,所以连接键的取值为依据进行合并。
merge函数
merge函数的语法格式如下:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
其中,参数left和right分别表示要合并的两个数据框,how表示连接类型,on表示连接键(列名或索引),left_on和right_on分别指定左右数据框所使用的连接键(如果不同的话),left_index和right_index表示是否将索引作为连接键,suffixes表示连接相同列名时在列名中添加的后缀(如果不需要则留空),sort表示是否对结果按照连接键进行排序,copy表示是否复制数据,indicator表示是否添加一列来标记合并的结果,validate表示验证合并数据的一致性。
以下是一个示例:
import pandas as pd
# 创建两个数据框
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
# 使用merge函数合并数据框
result = pd.merge(df1, df2, on='key')
print(result)
输出结果为:
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
从输出结果可以看出,使用merge函数将两个数据框进行合并后,相同的列名被保留并合并在一起。在这个例子中,连接键是key列,合并类型为inner join,表示将两个数据框在连接键的取值相同的情况下进行合并。
concat函数
前面已经介绍了concat函数在横向和纵向上进行数据框合并的用法,这里介绍一下concat函数在列方向上,以索引作为连接键进行合并的用法。该方法比较适用于需要合并多个数据框,并对它们在列上进行完全合并的情况。
以下是一个示例:
import pandas as pd
# 创建三个数据框
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'E': ['E0', 'E1', 'E2', 'E3'],
'F': ['F0', 'F1', 'F2', 'F3'],
'G': ['G0', 'G1', 'G2', 'G3'],
'H': ['H0', 'H1', 'H2', 'H3']},
index=[0, 1, 2, 3])
df3 = pd.DataFrame({'I': ['I0', 'I1', 'I2', 'I3'],
'J': ['J0', 'J1', 'J2', 'J3'],
'K': ['K0', 'K1', 'K2', 'K3'],
'L': ['L0', 'L1', 'L2', 'L3']},
index=[0, 1, 2, 3])
# 在列方向上使用concat函数合并数据框
result = pd.concat([df1, df2, df3], axis=1, keys=['df1', 'df2', 'df3'])
print(result)
输出结果为:
df1 ... df3
A B C D ... I J K L
0 A0 B0 C0 D0 ... I0 J0 K0 L0
1 A1 B1 C1 D1 ... I1 J1 K1 L1
2 A2 B2 C2 D2 ... I2 J2 K2 L2
3 A3 B3 C3 D3 ... I3 J3 K3 L3
[4 rows x 12 columns]
从输出结果可以看出,在列方向上使用concat函数将三个数据框进行合并后得到了一个新的数据框,其中列名被重新设置为了df1、df2和df3,并且原来的列名也被保留了。需要注意的是,在这个例子中,每个数据框都有相同的索引(0-3),因此可以使用该索引作为连接键来进行列合并。如果数据框的索引不同,则需要先使用join或merge函数合并成一个数据框再使用concat函数进行合并。