第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。禁用可以避免将数据复制到结果数据结构中 |
本文介绍使用Pandas库中的merge()函数实现数据合并的方法,包括内连接、外连接、左连接和右连接,并展示了如何通过指定连接键进行精确的数据合并。此外,还探讨了多对多合并操作以及合并后的重复列名处理。
1782

被折叠的 条评论
为什么被折叠?



