Merge, Join, Concat
Merge, Join, Concat,Sort
主要会从以下几个方面和大家分享:
Merge
Join
Concat
源码及GitHub地址
1. Merge
首先merge的操作非常类似sql里面的join,实现将两个Dataframe根据一些共有的列连接起来,当然,在实际场景中,这些共有列一般是Id, 连接方式也丰富多样,可以选择inner(默认),left,right,outer 这几种模式,分别对应的是内连接,左连接,右连接
1.1 InnerMerge (内连接)
首先让我们简单的创建两个DF,分别为DataFrame1,DataFrame2,他们的公有列是key
key
value_df1
0
X
0
1
Z
1
2
Y
2
3
Z
3
4
X
4
5
X
5
key
value_df2
0
Q
1
1
Y
2
2
Z
3
我们现在可以简单地使用pd.merge(dframe1,dframe2)来实现Merge功能
key
value_df1
value_df2
0
Z
1
3
1
Z
3
3
2
Y
2
2
我们现在需要注意一点,X仅仅是存在于dframe1的key,在dframe2中不存在,因此大家可以发现,当我们调用pd.merge的时候,会自动默认为inner join, 我们再换一种方式写一下,大家就明白了:
key
value_df1
value_df2
0
Z
1
3
1
Z
3
3
2
Y
2
1.2 LeftMerge (左连接)
key
value_df1
value_df2
0
X
0
NaN
1
Z
1
3.0
2
Y
2
2.0
3
Z
3
3.0
4
X
4
NaN
5
X
5
NaN
我们可以看到返回的是dframe1的所有key值对应的结果,如果在dframe2中不存在,显示为Nan空值
1.3 RightMerge (右连接)
右连接的原理和左连接正相反
key
value_df1
value_df2
0
Z
1.0
3
1
Z
3.0
3
2
Y
2.0
2
3
Q
NaN
1
这里Q只存在于drame2的key中
1.4 OuterMerge (全连接)
key
value_df1
value_df2
0
X
0.0
NaN
1
X
4.0
NaN
2
X
5.0
NaN
3
Z
1.0
3.0
4
Z
3.0
3.0
5
Y
2.0
2.0
6
Q
NaN
1.0
1.5 MultipleKey Merge (基于多个key上的merge)
刚才我们都是仅仅实现的在一个key上的merge,当然我们也可以实现基于多个keys的merge
key1
key2
left_data
0
SF
one
10
1
SF
two
20
2
LA
one
30
key1
key2
right_data
0
SF
one
40
1
SF
one
50
2
LA
one
60
3
LA
two
70
key1
key2
left_data
right_data
0
SF
one
10
40
1
SF
one
10
50
2
LA
one
30
60
key1
key2
left_data
right_data
0
SF
one
10.0
40.0
1
SF
one
10.0
50.0
2
SF
two
20.0
NaN
3
LA
one
30.0
60.0
4
LA
two
NaN
70.0
这里还有一个地方非常有意思,大家可以发现现在df_left,df_right作为key的两列分别是key1和key2,它们的名字是相同的,刚刚我们是通过制定on=[‘key1’, ‘key2’],那如果我们只指定一列会怎么样呢?
key1
key2_x
left_data
key2_y
right_data
0
SF
one
10
one
40
1
SF
one
10
one
50
2
SF
two
20
one
40
3
SF
two
20
one
50
4
LA
one
30
one
60
5
LA
one
30
two
70
大家可以看到pandas自动把key2这一列拆分成了key2_x和key2_y,都会显示在最后的merge结果里,如果我们想要给这两列重新命名,也是很容易的:
key1
key2_lefty
left_data
key2_righty
right_data
0
SF
one
10
one
40
1
SF
one
10
one
50
2
SF
two
20
one
40
3
SF
two
20
one
50
4
LA
one
30
one
60
5
LA
one
30
two
70
像这样,可以通过suffixes参数来指定拆分的列的名字。
1.6 Merge on Index (基于index上的merge)
key
data
0
X
0
1
Y
1
2
Z
2
3
X
3
4
Y
4
group_data
X
10
Y
20
现在想要实现两个Dataframe的merge,但是条件是通过df_left的Key和df_right的Index
key
data
group_data
0
X
0
10
3
X
3
10
1
Y
1
20
4
Y
4
20
这样我们也可以得到结果。
key
data
group_data
0
X
0
10.0
3
X
3
10.0
1
Y
1
20.0
4
Y
4
20.0
2
Z
2
NaN
其他的merge方式就类似啦,这里就不一一说了,只是举一个outer join的例子
key
data
group_data
0
X
0
10.0
3
X
3
10.0
1
Y
1
20.0
4
Y
4
20.0
2
Z
2
NaN
我们可以尝试其他的merge,比如如果一个df的index是多层嵌套的情况
key1
key2
data_set
0
SF
10
0.0
1
SF
20
1.0
2
SF
30
2.0
3
LA
20
3.0
4
LA
30
4.0
col_1
col_2
LA
20
0
1
10
2
3
SF
10
4
5
10
6
7
20
8
9
现在我们穿建了两个Dataframe 分别是df_left_hr和df_right_hr(Index两层),如果我们想通过使用df_left_hr的key1,key2 及df_right_hr的Index作为merge 的列,也是没有问题的
key1
key2
data_set
col_1
col_2
0
SF
10
0.0
4
5
0
SF
10
0.0
6
7
1
SF
20
1.0
8
9
3
LA
20
3.0
0
1
基本到这里,我已经和大家分享了基础的Merge有关的所有操作,如果你平时生活工作中经常使用Excel执行类似操作的话,可以学习一下Merge哈,它会大幅度 减轻你的工作强度的!
2.Join
现在我们可以接着来看join相关的操作,先让我们看一个小例子
A
B
K0
A0
B0
K1
A1
B1
K2
A2
B2
K3
A3
B3
C
D
K0
C0
D0
K1
C1
D1
K2
C2
D2
K3
C3
D3
A
B
C
D
K0
A0
B0
C0
D0
K1
A1
B1
C1
D1
K2
A2
B2
C2
D2
K3
A3
B3
C3
D3
其实通过这一个小例子大家也就明白了,join无非就是合并,默认是横向,还有一个点需要注意的是,我们其实可以通过join实现和merge一样的效果,但是为了 避免混淆,我不会多举其他的例子了,因为我个人认为一般情况下还是用merge函数好一些
3. Concat
为了更加全面彻底地了解Concat函数,大家可以先从一维的Numpy Array开始,首先让我们简单的创建一个矩阵:
让我们通过concatenate函数进行横向拼接
再让我们进行纵向拼接:
有了基础的印象之后,现在让我们看看在pandas中是如何操作的:
在上面的例子中,我们分别创建了两个没有重复Index的Series,然后用concat默认的把它们合并在一起,这时生成的依然是Series类型,如果我们把axis换成1,那生成的就是Dataframe,像下面一样
0
1
T
0.0
NaN
U
1.0
NaN
V
2.0
NaN
X
NaN
3.0
Y
NaN
4.0
我们还可以指定在哪些index上进行concat:
0
1
U
1.0
NaN
V
2.0
NaN
Y
NaN
4.0
也可以给不同组的index加一层标签
如果把axis换成是1,那么keys就会变成column的名字:
cat1
cat2
T
0.0
NaN
U
1.0
NaN
V
2.0
NaN
X
NaN
3.0
Y
NaN
4.0
如果是两个现成的dataframe直接进行concat也是一样:
X
Y
Z
0
1.119976
-0.853960
0.027451
1
-0.536831
0.982092
-0.157650
2
-0.219322
-1.489809
1.607735
3
0.767249
-1.661912
0.038837
Y
Q
X
0
-0.035560
0.875282
-1.630508
1
-0.439484
0.096247
1.335693
2
0.746299
0.568684
1.197015
Q
X
Y
Z
0
NaN
1.119976
-0.853960
0.027451
1
NaN
-0.536831
0.982092
-0.157650
2
NaN
-0.219322
-1.489809
1.607735
3
NaN
0.767249
-1.661912
0.038837
0
0.875282
-1.630508
-0.035560
NaN
1
0.096247
1.335693
-0.439484
NaN
2
0.568684
1.197015
0.746299
NaN
4. 总结
Github仓库地址: https://github.com/yaozeliang/pandas_shar
Last updated