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