您的位置:首页 > 编程语言 > Python开发

第7章 数据规整化:清理、转换、合并、重塑 (1)

2017-12-03 13:58 441 查看

第7章 数据规整化:清理、转换、合并、重塑 (1)

DataFrame.merge()

merge()用于对列的合并

import pandas as pd;import numpy as np
from pandas import Series,DataFrame

df1 = DataFrame({'key':['b','b','a','c','a','a','b'],
'data1':range(7)})
df2 = DataFrame({'key':['a','b','d'],
'data2':range(3)})
###df1
data1 key
0      0   b
1      1   b
2      2   a
3      3   c
4      4   a
5      5   a
6      6   b
###df2
data2 key
0      0   a
1      1   b
2      2   d

##merge()不指定用哪个列连接时,会将重叠列的列名当作键,不推荐

pd.merge(df1,df2)

#######Output############
data1 key  data2
0      0   b      1
1      1   b      1
2      6   b      1
3      2   a      0
4      4   a      0
5      5   a      0

##on用来指定连接的列

pd.merge(df1,df2,on='key')

#######Output############
data1 key  data2
0      0   b      1
1      1   b      1
2      6   b      1
3      2   a      0
4      4   a      0
5      5   a      0

##---merge()合并默认是"inner"连接,即取键的交集,除此以外还有"left""right""outer","outer"是取键并集,包括左连接右连接,用参数"how"指定

pd.merge(df1,df2,on='key',how='outer')

#######Output############
data1 key  data2
0    0.0   b    1.0
1    1.0   b    1.0
2    6.0   b    1.0
3    2.0   a    0.0
4    4.0   a    0.0
5    5.0   a    0.0
6    3.0   c    NaN
7    NaN   d    2.0

pd.merge(df1,df2,on='key',how='left')

#######Output############
data1 key  data2
0      0   b    1.0
1      1   b    1.0
2      2   a    0.0
3      3   c    NaN
4      4   a    0.0
5      5   a    0.0
6      6   b    1.0

pd.merge(df1,df2,on='key',how='right')

#######Output############
data1 key  data2
0    0.0   b      1
1    1.0   b      1
2    6.0   b      1
3    2.0   a      0
4    4.0   a      0
5    5.0   a      0
6    NaN   d      2

####上述情况中两个DataFrame合并的列有同样的名字,如果名字不同,可以分别指定,此时不会合并为一列,保留各自列的名字

df3 = DataFrame({'lkey':['b','b','a','c','a','a','c'],
'data1':range(7)})
df4 = DataFrame({'rkey':['a','b','d'],
'data2':range(3)})

###df3
data1 lkey
0      0    b
1      1    b
2      2    a
3      3    c
4      4    a
5      5    a
6      6    c

###df4
data2 rkey
0      0    a
1      1    b
2      2    d

pd.merge(df3,df4,left_on='lkey',right_on='rkey')

#######Output############
data1 lkey  data2 rkey
0      0    b      1    b
1      1    b      1    b
2      2    a      0    a
3      4    a      0    a
4      5    a      0    a

###多对多合并操作
df5 = DataFrame({'key':['b','b','a','c','a','b'],
'data1':range(6)})
df6 = DataFrame({'key':['a','b','a','b','d'],
'data2':range(5)})

###df5
data1 key
0      0   b
1      1   b
2      2   a
3      3   c
4      4   a
5      5   b

###df6
data2 key
0      0   a
1      1   b
2      2   a
3      3   b
4      4   d

####左连接

pd.merge(df5,df6,on = 'key',how='left')

#######Output############
data1 key  data2
0       0   b    1.0
1       0   b    3.0
2       1   b    1.0
3       1   b    3.0
4       2   a    0.0
5       2   a    2.0
6       3   c    NaN
7       4   a    0.0
8       4   a    2.0
9       5   b    1.0
10      5   b    3.0

####多对多连接产生的行是笛卡尔乘积
####内连接

pd.merge(df5,df6,on='key',how='inner')

#######Output############
data1 key  data2
0      0   b      1
1      0   b      3
2      1   b      1
3      1   b      3
4      5   b      1
5      5   b      3
6      2   a      0
7      2   a      2
8      4   a      0
9      4   a      2

#####多个键合并
left = DataFrame({'key1':['foo','foo','bar'],
'key2':['one','two','one'],
'lval':[1,2,3]})
right = DataFrame({'key1':['foo','foo','bar','bar'],
'key2':['one','one','one','two'],
'rval':[4,5,6,7]})

###left
key1 key2  lval
0  foo  one     1
1  foo  two     2
2  bar  one     3

###right
key1 key2  rval
0  foo  one     4
1  foo  one     5
2  bar  one     6
3  bar  two     7

###传入由列名组成的列表

pd.merge(left,right,on=['key1','key2'],how='outer')

#######Output############
key1 key2  lval  rval
0  foo  one   1.0   4.0
1  foo  one   1.0   5.0
2  foo  two   2.0   NaN
3  bar  one   3.0   6.0
4  bar  two   NaN   7.0

####合并后对重复列名的处理,suffixes可用于指定附加在两个对象重复列名后面的后缀

pd.merge(left,right,on='key1')#出现key2列名重复
#######Output############
key1 key2_x  lval key2_y  rval
0  foo    one     1    one     4
1  foo    one     1    one     5
2  foo    two     2    one     4
3  foo    two     2    one     5
4  bar    one     3    one     6
5  bar    one     3    two     7

####suffixes=('','')
pd.merge(left,right,on='key1',suffixes=('left','right'))
#######Output############
key1 key2left  lval key2right  rval
0  foo      one     1       one     4
1  foo      one     1       one     5
2  foo      two     2       one     4
3  foo      two     2       one     5
4  bar      one     3       one     6
5  bar      one     3       two     7


Merge()函数参数

参数说明
left参与合并的左侧DataFrame
right参与合并的右侧DataFrame
how“inner”,”outer”,”left”,”right”其中之一,默认为”inner”
on用于连接的列名,必须存在左右两个DataFrame中,如果不指定,其他连接键也不指定,以left和right列名的交集作为连接键
left_on左侧DataFrame用作连接键的列
right_on右侧DataFrame用作连接键的列
left_index左侧行索引作为连接键
right_index右侧行索引作为连接键
sort根据连接键对合并后数据进行排序,默认为True,处理大数据时,禁用能获得更好性能
suffixes追加到重叠列名末尾,用于区分,默认是=(‘_x’,’_y’)
copy默认为True。禁用可以避免将数据复制到结果数据结构中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  numpy 数据
相关文章推荐