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
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,
)
show time!!!
参数 | 说明 |
---|---|
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合并的范围小,仅支持索引连接
当然了作为评委的你们觉得如何呢
我们下期见,不说拜拜~