在pandas中,合并表格的方法主要有以下几种,每种方法适用于不同的情况:
-
pd.concat()
- 适用情况: 当需要将多个DataFrame在行或列方向上进行简单的拼接时。
- 用法:
pd.concat([df1, df2], axis=0) # 按行拼接 pd.concat([df1, df2], axis=1) # 按列拼接
-
pd.merge()
- 适用情况: 当需要根据一个或多个键将两个DataFrame进行合并时,类似于SQL中的JOIN操作。
- 用法:
pd.merge(df1, df2, on='key') # 按单个键合并 pd.merge(df1, df2, on=['key1', 'key2']) # 按多个键合并 pd.merge(df1, df2, left_on='key1', right_on='key2') # 左右DataFrame的键不同
- 类型:
how='inner'
(默认): 内连接how='outer'
: 外连接how='left'
: 左连接how='right'
: 右连接
-
df.join()
- 适用情况: 当需要根据索引将两个DataFrame进行合并时,通常用于连接列数较少的DataFrame。
- 用法:
df1.join(df2) # 按索引合并 df1.join(df2, on='key') # 指定键进行合并
- 类型:
how='left'
(默认): 左连接how='right'
: 右连接how='outer'
: 外连接how='inner'
: 内连接
-
df.append()
- 适用情况: 当需要将一个DataFrame的行添加到另一个DataFrame的末尾时。
- 用法:
df1.append(df2)
完整示例
import pandas as pd
# 创建示例DataFrame
df1 = pd.DataFrame({
'key': ['A', 'B', 'C'],
'value1': [1, 2, 3]
})
df2 = pd.DataFrame({
'key': ['B', 'C', 'D'],
'value2': [4, 5, 6]
})
# 1. 使用pd.concat()按行拼接
result_concat = pd.concat([df1, df2], axis=0)
# 2. 使用pd.merge()按键合并
result_merge = pd.merge(df1, df2, on='key', how='inner')
# 3. 使用df.join()按索引合并
df1.set_index('key', inplace=True)
df2.set_index('key', inplace=True)
result_join = df1.join(df2, how='inner')
# 4. 使用df.append()添加行
result_append = df1.reset_index().append(df2.reset_index(), ignore_index=True)
补充说明
左连接、右连接、外连接和内连接是数据表合并中的不同类型,主要用于确定在合并过程中保留哪些记录。它们的定义和区别如下:
-
左连接 (Left Join):
-
定义: 左连接保留左表(第一个表)中的所有记录,以及右表(第二个表)中与左表匹配的记录。对于左表中没有匹配的右表记录,会在右表的列中填充NaN。
-
示意图:
左表: A, B, C 右表: B, C, D 左连接结果: A, B, C, D(空)
-
-
右连接 (Right Join):
-
定义: 右连接保留右表(第二个表)中的所有记录,以及左表(第一个表)中与右表匹配的记录。对于右表中没有匹配的左表记录,会在左表的列中填充NaN。
-
示意图:
左表: A, B, C 右表: B, C, D 右连接结果: (空)A, B, C, D
-
-
外连接 (Outer Join):
-
定义: 外连接保留左表和右表中的所有记录。不匹配的部分在相应的列中填充NaN。
-
示意图:
左表: A, B, C 右表: B, C, D 外连接结果: A, B, C, D
-
-
内连接 (Inner Join):
-
定义: 内连接仅保留两个表中都存在的匹配记录,不匹配的部分会被过滤掉。
-
示意图:
左表: A, B, C 右表: B, C, D 内连接结果: B, C
-
示例代码
import pandas as pd
# 创建示例DataFrame
df1 = pd.DataFrame({
'key': ['A', 'B', 'C'],
'value1': [1, 2, 3]
})
df2 = pd.DataFrame({
'key': ['B', 'C', 'D'],
'value2': [4, 5, 6]
})
# 1. 左连接
left_join = pd.merge(df1, df2, on='key', how='left')
print("左连接结果:\n", left_join)
# 2. 右连接
right_join = pd.merge(df1, df2, on='key', how='right')
print("右连接结果:\n", right_join)
# 3. 外连接
outer_join = pd.merge(df1, df2, on='key', how='outer')
print("外连接结果:\n", outer_join)
# 4. 内连接
inner_join = pd.merge(df1, df2, on='key', how='inner')
print("内连接结果:\n", inner_join)
输出结果
左连接结果:
key value1 value2
0 A 1 NaN
1 B 2 4.0
2 C 3 5.0
右连接结果:
key value1 value2
0 B 2.0 4
1 C 3.0 5
2 D NaN 6
外连接结果:
key value1 value2
0 A 1.0 NaN
1 B 2.0 4.0
2 C 3.0 5.0
3 D NaN 6.0
内连接结果:
key value1 value2
0 B 2 4
1 C 3 5