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,可以在某些特殊情况下避免将数据复制到结果数据结构中。默认总是复制;

posted @ 2020-05-07 14:55  知识追寻者  阅读(575)  评论(0编辑  收藏  举报