Join&Merge Pandas Dataframe

2019-01-04  本文已影响0人  RossH

导入模块

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 joininner joinleft joinright join更多解释可以看博客A Visual Explanation of SQL Joins

上一篇下一篇

猜你喜欢

热点阅读