concat/merge/join

merge:

merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=('_x','_y'),copy=True,indicator=False)

left与right:合并操作时左右两个不同的df
how:inner(默认)、outer、left、right——相当于SQL中的连接方式
on:需要连接的列名,必须是在左右两边都有的列名,在on后多个键可以多键连接
left_on:left中用作连接键的列,此参数在左右两个df中没有相同列名但指定意思相似时可用
right_on:同left_on
left_index:使用left的行索引作为它的连接键,这种情况下最好用join
right_index:同left_index
sort:通过连接键按字母顺序对合并的数据进行排序,在默认情况下为True,为了更好的性能
suffixes:当左右两个DataFrame的列名重复时,来指定后缀,默认为'_x''_y'
copy:如果为False,则在某些特殊情况下避免将数据复制到结果数据结构中,默认为True
indicator:添加一个特殊的列,指示每一行的来源,值将根据每行中的连接数据的来源分为‘left_only’,'right_only','both'

join:

df.join(other,on=None,how='left',lsuffix='',rsuffix='',sort=False)

1、要合并的键的列名相同,内容相似

df12 = pd.DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})

   data1 key
0      0   b
1      1   b
2      2   a
3      3   c
4      4   a
5      5   b
df22 = pd.DataFrame({'key':['a','b','a','b','d'],'data2':range(5)})

   data2 key
0      0   a
1      1   b
2      2   a
3      3   b
4      4   d
#merge
one = pd.merge(df12,df22,how='left')#相当于sql中的左连接
    data1 key  data2
0       0   b    1.0
1       0   b    3.0
2       1   b    1.0
3       1   b    3.0
4       2   a    0.0
5       2   a    2.0
6       3   c    NaN
7       4   a    0.0
8       4   a    2.0
9       5   b    1.0
10      5   b    3.0

要想实现one这种连接,用join也可以实现

four = df12.join(df22.set_index('key'),on='key')
将df22中的key设置成索引后,可得到one一样的DataFrame

   data1 key  data2
0      0   b    1.0
0      0   b    3.0
1      1   b    1.0
1      1   b    3.0
2      2   a    0.0
2      2   a    2.0
3      3   c    NaN
4      4   a    0.0
4      4   a    2.0
5      5   b    1.0
5      5   b    3.0

从上,join最适合的合并是基于行索引index
通常情况下,能用merge就用merge进行合并。

1.2 两个dataframe的要合并的键相似,但键名不同

df3 = pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
df4 = pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})
#merge
df3_merge_df4 = pd.merge(df3,df4,left_on='lkey',right_on='rkey')

   data1 lkey  data2 rkey
0      0    b      1    b
1      1    b      1    b
2      6    b      1    b
3      2    a      0    a
4      4    a      0    a
5      5    a      0    a
#join
df3_join_df4 = df3.join(df4.set_index('rkey'),on='lkey',how='inner')

   data1 lkey  data2
0      0    b      1
1      1    b      1
6      6    b      1
2      2    a      0
4      4    a      0
5      5    a      0

concat:

拼接,默认是沿着axis=0的轴向生效的,即跨行操作(沿着每一行垂直向下)

data1 = pd.DataFrame(np.arange(6).reshape(2,3),columns=list('abc'))
data2 = pd.DataFrame(np.arange(20,26).reshape(2,3),columns=list('ayz'))
#concat,axis=0
data_concat0 = pd.concat([data1,data2])

    a    b    c     y     z
0   0  1.0  2.0   NaN   NaN
1   3  4.0  5.0   NaN   NaN
0  20  NaN  NaN  21.0  22.0
1  23  NaN  NaN  24.0  25.0
#merge
data_merge = pd.merge(data1,data2,on='a',how='outer')

    a    b    c     y     z
0   0  1.0  2.0   NaN   NaN
1   3  4.0  5.0   NaN   NaN
2  20  NaN  NaN  21.0  22.0
3  23  NaN  NaN  24.0  25.0

当axis=1时,按照axis=1的轴向拼接,跨列操作

#concat,axis=1
data_concat1 = pd.concat([data1,data2],axis=1)

   a  b  c   a   y   z
0  0  1  2  20  21  22
1  3  4  5  23  24  25
#join
data_join = data1.join(data2,lsuffix='_l')
   a_l  b  c   a   y   z
0    0  1  2  20  21  22
1    3  4  5  23  24  25

综上:
1、concat用于拼接,可拼接多个,区别在axis=0或1
2、merge类比成sql中的join
3、两个df合并时,用merge就行,三个及以上的df合并可用join,但前提是要将合并的那个键设置成index。

df1 = pd.DataFrame({'水果':['香蕉','橘子','苹果','梨子'],'销量1':[11,22,33,44]})
df2 = pd.DataFrame({'水果':['香蕉','橘子','苹果','梨子'],'销量2':[23,24,25,26]})
df3 = pd.DataFrame({'水果':['香蕉','橘子','苹果','梨子'],'销量3':[16,17,18,19]})

df1 = df1.set_index('水果')
df2 = df2.set_index('水果')
df3 = df3.set_index('水果')
c = df1.join([df2,df3])
print(c)
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容