导入模块
import pandas as pd
创建一个DataFrame
raw_data = {
'subject_id': ['1', '2', '3', '4', '5'],
'name': ['张三', '李四', '赵五', '何大', '胡二']}
df_a = pd.DataFrame(raw_data, columns = ['subject_id', 'name'])
df_a
|
subject_id |
name |
0 |
1 |
张三 |
1 |
2 |
李四 |
2 |
3 |
赵五 |
3 |
4 |
何大 |
4 |
5 |
胡二 |
创建第二个DataFrame
raw_data = {
'subject_id': ['4', '5', '6', '7', '8'],
'name': ['张三丰', '张无忌', '郭靖', '吴莫愁', '杨过']}
df_b = pd.DataFrame(raw_data, columns = ['subject_id', 'name'])
df_b
|
subject_id |
name |
0 |
4 |
张三丰 |
1 |
5 |
张无忌 |
2 |
6 |
郭靖 |
3 |
7 |
吴莫愁 |
4 |
8 |
杨过 |
创建第三个DataFrame
raw_data = {
'subject_id': ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'],
'test_id': [51, 15, 15, 61, 16, 14, 15, 1, 61, 16]}
df_n = pd.DataFrame(raw_data, columns = ['subject_id','test_id'])
df_n
|
subject_id |
test_id |
0 |
1 |
51 |
1 |
2 |
15 |
2 |
3 |
15 |
3 |
4 |
61 |
4 |
5 |
16 |
5 |
7 |
14 |
6 |
8 |
15 |
7 |
9 |
1 |
8 |
10 |
61 |
9 |
11 |
1 |
按行连接两个DataFrame
df_new = pd.concat([df_a, df_b])
df_new
|
subject_id |
name |
0 |
1 |
张三 |
1 |
2 |
李四 |
2 |
3 |
赵五 |
3 |
4 |
何大 |
4 |
5 |
胡二 |
0 |
4 |
张三丰 |
1 |
5 |
张无忌 |
2 |
6 |
郭靖 |
3 |
7 |
吴莫愁 |
4 |
8 |
杨过 |
按列连接两个DataFrame
pd.concat([df_a, df_b], axis=1)
|
subject_id |
name |
subject_id |
name |
0 |
1 |
张三 |
4 |
张三丰 |
1 |
2 |
李四 |
5 |
张无忌 |
2 |
3 |
赵五 |
6 |
郭靖 |
3 |
4 |
何大 |
7 |
吴莫愁 |
4 |
5 |
胡二 |
8 |
杨过 |
按subject_id合并两个DataFrame
pd.merge(df_new, df_n, on='subject_id')
|
subject_id |
name |
test_id |
0 |
1 |
张三 |
51 |
1 |
2 |
李四 |
15 |
2 |
3 |
赵五 |
15 |
3 |
4 |
何大 |
61 |
4 |
4 |
张三丰 |
61 |
5 |
5 |
胡二 |
16 |
6 |
5 |
张无忌 |
16 |
7 |
7 |
吴莫愁 |
14 |
8 |
8 |
杨过 |
15 |
pd.merge(df_new, df_n, left_on='subject_id', right_on='subject_id')
|
subject_id |
name |
test_id |
0 |
1 |
张三 |
51 |
1 |
2 |
李四 |
15 |
2 |
3 |
赵五 |
15 |
3 |
4 |
何大 |
61 |
4 |
4 |
张三丰 |
61 |
5 |
5 |
胡二 |
16 |
6 |
5 |
张无忌 |
16 |
7 |
7 |
吴莫愁 |
14 |
8 |
8 |
杨过 |
15 |
外连接合并
外(全)连接生成表A和表B中所有记录的集合,两侧的匹配记录可用。 如果没有匹配,则缺少的一方将包含null。
pd.merge(df_a, df_b, on='subject_id', how='outer')
|
subject_id |
name_x |
name_y |
0 |
1 |
张三 |
NaN |
1 |
2 |
李四 |
NaN |
2 |
3 |
赵五 |
NaN |
3 |
4 |
何大 |
张三丰 |
4 |
5 |
胡二 |
张无忌 |
5 |
6 |
NaN |
郭靖 |
6 |
7 |
NaN |
吴莫愁 |
7 |
8 |
NaN |
杨过 |
内连接合并
内连接仅生成在表A和表B中都匹配的记录集。
pd.merge(df_a, df_b, on='subject_id', how='inner')
|
subject_id |
name_x |
name_y |
0 |
4 |
何大 |
张三丰 |
1 |
5 |
胡二 |
张无忌 |
左连接合并
左连接(left join)从表A生成一组完整的记录,其中包含表B中的匹配记录(如果有的话)。如果没有匹配,则右侧将包含null。
pd.merge(df_a, df_b, on='subject_id', how='left')
|
subject_id |
name_x |
name_y |
0 |
1 |
张三 |
NaN |
1 |
2 |
李四 |
NaN |
2 |
3 |
赵五 |
NaN |
3 |
4 |
何大 |
张三丰 |
4 |
5 |
胡二 |
张无忌 |
右连接合并
pd.merge(df_a, df_b, on='subject_id', how='right')
|
subject_id |
name_x |
name_y |
0 |
4 |
何大 |
张三丰 |
1 |
5 |
胡二 |
张无忌 |
2 |
6 |
NaN |
郭靖 |
3 |
7 |
NaN |
吴莫愁 |
4 |
8 |
NaN |
杨过 |
合并时对重复的列名加后缀
pd.merge(df_a, df_b, on='subject_id', how='left', suffixes=('_left', '_right'))
|
subject_id |
name_left |
name_right |
0 |
1 |
张三 |
NaN |
1 |
2 |
李四 |
NaN |
2 |
3 |
赵五 |
NaN |
3 |
4 |
何大 |
张三丰 |
4 |
5 |
胡二 |
张无忌 |
基于索引合并
pd.merge(df_a, df_b, right_index=True, left_index=True)
|
subject_id_x |
name_x |
subject_id_y |
name_y |
0 |
1 |
张三 |
4 |
张三丰 |
1 |
2 |
李四 |
5 |
张无忌 |
2 |
3 |
赵五 |
6 |
郭靖 |
3 |
4 |
何大 |
7 |
吴莫愁 |
4 |
5 |
胡二 |
8 |
杨过 |
参考
关于full outer join,inner join,left join,right join更多解释可以看博客A Visual Explanation of SQL Joins