zoukankan      html  css  js  c++  java
  • pandas数据合并

    一 前言

    本篇的文章主要讲述了DataFrame中Merge函数的使用方式,如果学过SQL语法的读者可能对其上手会非常快,否则需要好好研究一会,知识追寻者相信,能看到这篇文章的都是已经学过SQL的读者,要不然你怎么会懂pyhton,任何一门计算机语言学到深处基本都离不开SQL操作;

    公众号:知识追寻者

    知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

    二 merge 操作

    2.1 数据准备

    DataFrame1

    # -*- coding: utf-8 -*-
    
    
    import pandas as pd
    import numpy as np
    
    data1 = {
        'user' : ['zszxz','craler','rose'],
        'price' : [100, 200, 300],
        'hobby' : ['reading','running','hiking']
    }
    index1 = ['user1','user2','user3']
    frame1  = pd.DataFrame(data1,index1)
    print(frame1)
    

    输出

             user  price    hobby
    user1   zszxz    100  reading
    user2  craler    200  running
    user3    rose    300   hiking
    

    DataFrame2

    # -*- coding: utf-8 -*-
    
    
    import pandas as pd
    import numpy as np
    
    data2 = {
        'user' : ['zszxz','craler','rose'],
        'price' : [100, 2000, 3000],
        'activity' : ['hiking','riding','climbing']
    }
    index2 = ['user1','user2','user3']
    frame2  = pd.DataFrame(data2,index2)
    print(frame2)
    

    输出

             user  price  activity
    user1   zszxz    100    hiking
    user2  craler   2000    riding
    user3    rose   3000  climbing
    

    2.2 默认合并

    会默认采取拥有共同得列进行合并,不可描述得是不知道以哪个列为基准;这个合并类似SQL语句中得表连接 比如 on 后面2个主键相等得条件,SQL中得键就是DataFrame合并中的基准列。一般情况下不推荐使用默认合并,应指明合并的基准列;

    # 两个对象具有相同列合并
    frame = pd.merge(frame1,frame2)
    print(frame)
    

    输出

        user  price    hobby activity
    0  zszxz    100  reading   hiking
    

    2.2 显示合并

    指明合并的基准列,用参数on进行指定;下列示例中以user列为基准进行联结。可以看出,如果有相同的列,会分左右,分别用x,y以作区分;敲黑板画重点了:在合并时以基准列列键,相同行则合并为一行,否则保留

    # 以 user为标准合并
    frame = pd.merge(frame1,frame2,on='user')
    print(frame)
    

    输出

         user  price_x    hobby  price_y  activity
    0   zszxz      100  reading      100    hiking
    1  craler      200  running     2000    riding
    2    rose      300   hiking     3000  climbing
    

    当左右DataFrame的列不一致的时候,就需要分别指定基准列;使用left_on指定左键,使用right_on指定右键;

    # 
    frame = pd.merge(frame1,frame2,left_on='hobby',right_on='activity')
    print(frame)
    

    输出

      user_x  price_x   hobby user_y  price_y activity
    0   rose      300  hiking  zszxz      100   hiking
    

    2.3 外联结

    使用how可以指定联结方式;如果不指定默认为inner;outer相当于左右联结之和;

    # 以 user为标准合并
    frame = pd.merge(frame1,frame2,on='user', how='outer')
    print(frame)
    

    输出

         user  price_x    hobby  price_y  activity
    0   zszxz      100  reading      100    hiking
    1  craler      200  running     2000    riding
    2    rose      300   hiking     3000  climbing
    

    2.4 左联结

    会显示出左边所有DataFrame的列;

    frame = pd.merge(frame1,frame2,on='user', how='left')
    print(frame)
    

    输出

         user  price_x    hobby  price_y  activity
    0   zszxz      100  reading      100    hiking
    1  craler      200  running     2000    riding
    2    rose      300   hiking     3000  climbing
    

    2.5 右联结

    会显示出右边所有DataFrame的列;

    frame = pd.merge(frame1,frame2,on='user', how='right')
    print(frame)
    

    输出

         user  price_x    hobby  price_y  activity
    0   zszxz      100  reading      100    hiking
    1  craler      200  running     2000    riding
    2    rose      300   hiking     3000  climbing
    

    2.6 多列合并

    指定多列使用数组;将会以 user, price两列为基准,其中这两列行的值相对应完全相同时两个DataFrame才进行合并为一行;

    frame = pd.merge(frame1,frame2,on=['user','price'], how='outer')
    print(frame)
    

    输出

         user  price    hobby  activity
    0   zszxz    100  reading    hiking
    1  craler    200  running       NaN
    2    rose    300   hiking       NaN
    3  craler   2000      NaN    riding
    4    rose   3000      NaN  climbing
    

    2.7 以index合并

    left_index, right_index 都设置为true时,将以index为基准合并;

    frame = pd.merge(frame1,frame2,left_index=True,right_index=True)
    print(frame)
    

    输出

           user_x  price_x    hobby  user_y  price_y  activity
    user1   zszxz      100  reading   zszxz      100    hiking
    user2  craler      200  running  craler     2000    riding
    user3    rose      300   hiking    rose     3000  climbing
    

    三merge 参数说明

    • left 参与合并的左侧DataFrame

    • right 参与合并的右侧DataFrame

    • how 连接方式:‘inner’(默认);还有,‘outer’、‘left’、‘right’

    • on 用于连接的列名,必须同时存在于左右两个DataFrame对象中,如果位指定,则以left和right列名的交集作为连接键

    • left_on 左侧DataFarme中用作连接键的列

    • right_on 右侧DataFarme中用作连接键的列

    • left_index 将左侧的行索引用作其连接键

    • right_index 将右侧的行索引用作其连接键

    • sort 根据连接键对合并后的数据进行排序,默认为True。有时在处理大数据集时,禁用该选项可获得更好的性能

    • suffixes 字符串值元组,用于追加到重叠列名的末尾,默认为(‘_x’,‘_y’).例如,左右两个DataFrame对象都有‘data’,则结果中就会出现‘data_x’,‘data_y’

    • copy 设置为False,可以在某些特殊情况下避免将数据复制到结果数据结构中。默认总是复制;

  • 相关阅读:
    LinkedList类源码浅析(一)
    ArrayList类源码浅析(三)
    我谁也没等,因为谁也不会来
    维持一段友谊
    最甜美的悲伤
    小美人访谈录笔记[1]
    1984我想对这个世界说些什么
    我喜欢我
    等不来的始终等不来,无须报以希望
    我抱有怀疑
  • 原文地址:https://www.cnblogs.com/zszxz/p/12843066.html
Copyright © 2011-2022 走看看