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