2020年合并头牌之战
进行大战的背景
今日阳光明媚,今日万里无云,函数届的<不讲武德>比赛拉开序幕,首当其冲的就是小梦(merge)、小超(concat),也是合并功能里的俊男靓女,随着一只小虫(数据)的入场,大战一触即发~~
大赛前的寒暄
01
主办方
本次活动的主办方是Python和Pandas
02
小梦merge
小超呀,你认识sql中的join兄么,我们可是好兄弟(用法非常类似)
03
小超concat
哼,我和数据库中的UNION ALL(全连接)还是好姐妹呢
04
python/pandas
你们两个还比不比,攀亲戚来了呐,小梦你先来
merge
pd.merge(
left,
right,
how='inner',
on=None,
left_on=None,
right_on=None,
left_index=False,
right_index=False,
sort=False,
suffixes=('_x', '_y'),
copy=True,
indicator=False,
validate=None,
)
参数 | 说明 |
---|---|
left | 参与合并的左侧DataFrame |
right | 参与合并的右侧DataFrame |
how | 表示连接方式,默认为inner,还有'left','right','outer' |
on | 用于连接的列名,必须同时存在于左右两个DataFrame对象中,如果位指定,则以left和right列名的交集作为连接键 |
left_on | 以左侧的DataFrame作为连接键 |
right_on | 以右侧的DataFrame作为连接键 |
left_index | 以左侧的行索引作为连接键 |
right_index | 以右侧的行索引作为连接键 |
sort | 根据连接键对合并后的数据进行排序,默认为True |
suffixes | 字符串值元组,用于追加到重叠列名的末尾,默认为('x','y') |
copy | 设置为False,可以在某些特殊情况下避免将数据复制到结果数据中。 |
indicator | bool或str,默认为False |
validate | str,可选,如果指定,则检查合并是否为指定类型。 |
小梦merge
怎么样小超,我的功能强大不?
囫囵吞枣,你得让我们都懂呀
小超concat
小梦merge
别着急,这只是热身,好戏还在后面呢
小梦merge
Pandas老师,可以给我一个场景么,我来
为大家展示一下~
小梦merge
咕嘟,开始喽~
import pandas as pd
import numpy as np
df1 = pd.DataFrame({"key":["a","b","c","d","e"],"data":np.arange(5)})
df1
key | data | |
---|---|---|
0 | a | 0 |
1 | b | 1 |
2 | c | 2 |
3 | d | 3 |
4 | e | 4 |
df2 = pd.DataFrame({"key":["a","b","c"],"data1":np.arange(3)})
df2
key | data1 | |
---|---|---|
0 | a | 0 |
1 | b | 1 |
2 | c | 2 |
#这两个的执行结果是一样的
pd.merge(df1,df2)
df1.merge(df2)
key | data | data1 | |
---|---|---|---|
0 | a | 0 | 0 |
1 | b | 1 | 1 |
2 | c | 2 | 2 |
#这三种的运行结果是一样的
pd.merge(df1,df2,on='key') # 默认是inner
pd.merge(df1,df2,on=['key'],how='inner')
df1.merge(df2,on='key')
key | data | data1 | |
---|---|---|---|
0 | a | 0 | 0 |
1 | b | 1 | 1 |
2 | c | 2 | 2 |
# 外连接,取并集,缺失值用NaN填充
pd.merge(df1,df2,on='key',how='outer')
key | data | data1 | |
---|---|---|---|
0 | a | 0 | 0.0 |
1 | b | 1 | 1.0 |
2 | c | 2 | 2.0 |
3 | d | 3 | NaN |
4 | e | 4 | NaN |
# 左连接,取df1的全部,df2的部分
pd.merge(df1,df2,on='key',how='left')
key | data | data1 | |
---|---|---|---|
0 | a | 0 | 0.0 |
1 | b | 1 | 1.0 |
2 | c | 2 | 2.0 |
3 | d | 3 | NaN |
4 | e | 4 | NaN |
# 右连接,取df2的全部,df1的部分
pd.merge(df1,df2,on='key',how='right')
key | data | data1 | |
---|---|---|---|
0 | a | 0 | 0 |
1 | b | 1 | 1 |
2 | c | 2 | 2 |
#如果左右侧DataFrame的链接键名不一样时,可使用left_on、right_on来制定左右连接键
d_df1 = pd.DataFrame({'key':['a','b','c','d','e','f'],'data1':range(6)})
d_df1
key | data1 | |
---|---|---|
0 | a | 0 |
1 | b | 1 |
2 | c | 2 |
3 | d | 3 |
4 | e | 4 |
5 | f | 5 |
d_df2 = pd.DataFrame({'key1':['a','b','c'],'data2':range(3)})
d_df2
key1 | data2 | |
---|---|---|
0 | a | 0 |
1 | b | 1 |
2 | c | 2 |
pd.merge(d_df1,d_df2,left_on='key',right_on='key1')
key | data1 | key1 | data2 | |
---|---|---|---|---|
0 | a | 0 | a | 0 |
1 | b | 1 | b | 1 |
2 | c | 2 | c | 2 |
嚯,还挺厉害,我不能紧张,看我娓娓道来
小超concat
pd.concat(
objs,
axis=0,
join='outer',
join_axes=None,
ignore_index=False,
keys=None,
levels=None,
names=None,
verify_integrity=False,
sort=None,
copy=True,
)
参数 | 说明 |
---|---|
objs | 连接的列表或字典,对象必须是pandas数据类型 |
axis | 按列或者行拼接,0是纵轴,1是横轴 |
join | 制定inner或outer,默认为outer |
keys | 默认无,如果传递了多个级别,则应包含元组。构造使用传递的键作为最外层的层次索引。 |
levels | 序列列表,默认无,用于构造多重索引 |
names | 创建分层级别的名称 |
verify_integrity | bool,默认为False,检查新的连接轴是否包含重复项 |
一向公正的pandas社长同样也为小超建造了一个场景~
df1 = pd.DataFrame(np.random.randn(2,2),columns=['x','y'])
df1
x | y | |
---|---|---|
0 | 1.239784 | 0.697781 |
1 | -2.510396 | 0.343820 |
df2 = pd.DataFrame(np.random.randn(4,2),columns=['x','z'])
df2
x | z | |
---|---|---|
0 | -1.158629 | -0.065128 |
1 | 0.410176 | -0.577408 |
2 | -0.663995 | -0.308309 |
3 | 0.138777 | -0.542335 |
家眷实团圆,一呼百诺至,给我合!(不知道哪里的口诀...)
张丽丽
# 默认是并集,纵向连接
result = pd.concat([df1,df2])
result
x | y | z | |
---|---|---|---|
0 | 1.239784 | 0.697781 | NaN |
1 | -2.510396 | 0.343820 | NaN |
0 | -1.158629 | NaN | -0.065128 |
1 | 0.410176 | NaN | -0.577408 |
2 | -0.663995 | NaN | -0.308309 |
3 | 0.138777 | NaN | -0.542335 |
#纵向取交集,横向取并集
pd.concat([df1,df2],axis=1,join='inner')
pd.concat([df1,df2],axis=1,join='outer')
这个大家可以自己拿去执行一些哦(其实是因为放文章里不太美观~)
不讲武德
两人你来我往了不知多久,主办方都鼾声四起了
pandas伸个懒腰,小结一下吧:
1.merge默认是内连接,concat默认是外连接
2.concat准确来说是拼接,axis参数决定横纵向拼接,在axis=1 时为横向拼接,等价于merge
3.merge合并的范围广泛,concat合并的范围小,仅支持索引连接
当然了作为评委的你们觉得如何呢