不讲武德赛拉开序幕

python连接大法

Python中merge、concat

今日阳光明媚,今日万里无云,函数届的<不讲武德>比赛拉开序幕,首当其冲的就是小梦(merge)、小超(concat),也是合并功能里的俊男靓女,随着一只小虫(数据)的入场,大战一触即发~~

本次活动的主办方是Python和Pandas

小梦先发制人:

我的技能可多了,一顿妙语连珠:

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,可以在某些特殊情况下避免将数据复制到结果数据中。
indicatorbool或str,默认为False
validatestr,可选,如果指定,则检查合并是否为指定类型。

怎么样小超,我的功能强大不?

切,你得让我们大家伙都懂才可以呀。

好,我要让你心服口服!

Pandas老师,可以给我一个场景么,我来为大家展示一下~

import pandas as pd
import numpy as np
df1 = pd.DataFrame({"key":["a","b","c","d","e"],"data":np.arange(5)})
df1
keydata
0a0
1b1
2c2
3d3
4e4
df2 = pd.DataFrame({"key":["a","b","c"],"data1":np.arange(3)})
df2
keydata1
0a0
1b1
2c2

小超,你可看好喽~

#这两个的执行结果是一样的
pd.merge(df1,df2)
df1.merge(df2)
keydatadata1
0a00
1b11
2c22
#这三种的运行结果是一样的
pd.merge(df1,df2,on='key') # 默认是inner
pd.merge(df1,df2,on=['key'],how='inner')
df1.merge(df2,on='key')
keydatadata1
0a00
1b11
2c22
# 外连接,取并集,缺失值用NaN填充
pd.merge(df1,df2,on='key',how='outer')
keydatadata1
0a00.0
1b11.0
2c22.0
3d3NaN
4e4NaN
# 左连接,取df1的全部,df2的部分
pd.merge(df1,df2,on='key',how='left')
keydatadata1
0a00.0
1b11.0
2c22.0
3d3NaN
4e4NaN
# 右连接,取df2的全部,df1的部分
pd.merge(df1,df2,on='key',how='right')
keydatadata1
0a00
1b11
2c22
#如果左右侧DataFrame的链接键名不一样时,可使用left_on、right_on来制定左右连接键
d_df1 = pd.DataFrame({'key':['a','b','c','d','e','f'],'data1':range(6)})
d_df1
keydata1
0a0
1b1
2c2
3d3
4e4
5f5
d_df2 = pd.DataFrame({'key1':['a','b','c'],'data2':range(3)})
d_df2
key1data2
0a0
1b1
2c2
pd.merge(d_df1,d_df2,left_on='key',right_on='key1')
keydata1key1data2
0a0a0
1b1b1
2c2c2

小样,跟我斗

耗子尾汁,我来让你看看我的技能吧

咕嘟,润一润嗓子,小超(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,
)

show time!!!

参数说明
objs连接的列表或字典,对象必须是pandas数据类型
axis按列或者行拼接,0是纵轴,1是横轴
join制定inner或outer,默认为outer
keys默认无,如果传递了多个级别,则应包含元组。构造使用传递的键作为最外层的层次索引。
levels序列列表,默认无,用于构造多重索引
names创建分层级别的名称
verify_integritybool,默认为False,检查新的连接轴是否包含重复项

一向公正的pandas社长同样也为小超建造了一个场景~

df1 = pd.DataFrame(np.random.randn(2,2),columns=['x','y'])
df1
xy
01.2397840.697781
1-2.5103960.343820
df2 = pd.DataFrame(np.random.randn(4,2),columns=['x','z'])
df2
xz
0-1.158629-0.065128
10.410176-0.577408
2-0.663995-0.308309
30.138777-0.542335

家眷实团圆,一呼百诺至

# 默认是并集,纵向连接
result = pd.concat([df1,df2])
result
xyz
01.2397840.697781NaN
1-2.5103960.343820NaN
0-1.158629NaN-0.065128
10.410176NaN-0.577408
2-0.663995NaN-0.308309
30.138777NaN-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合并的范围小,仅支持索引连接

当然了作为评委的你们觉得如何呢

我们下期见,不说拜拜~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值