python连接大法

天气图.jpg

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

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

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

好,我要让你心服口服!

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

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
- key data1
0 a 0
1 b 1
2 c 2
pd.merge(d_df1,d_df2,left_on='key',right_on='key1')
- key data key1 data1
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合并的范围小,仅支持索引连接

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

我们下期见,不说拜拜~

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容