美文网首页
Join&Merge Pandas Dataframe

Join&Merge Pandas Dataframe

作者: RossH | 来源:发表于2019-01-04 17:28 被阅读0次

    导入模块

    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

    相关文章

      网友评论

          本文标题:Join&Merge Pandas Dataframe

          本文链接:https://www.haomeiwen.com/subject/eiahrqtx.html