前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >左手用R右手Python系列——数据合并与追加

左手用R右手Python系列——数据合并与追加

作者头像
数据小磨坊
发布2018-04-11 17:01:37
1.7K0
发布2018-04-11 17:01:37
举报
文章被收录于专栏:数据小魔方数据小魔方

今天这篇跟大家介绍R语言与Python数据处理中的第二个小知识点——数据合并与追加。

针对数据合并与追加,R与Python中都有对应的函数可以快速完成需求,根据合并与追加的使用场景,这里我将本文内容分成三部分:

  • 数据合并(简单合并,无需匹配)
  • 数据合并(匹配合并)
  • 数据追加

数据合并(简单合并,无需匹配)

针对简单合并而言,在R语言中主要通过以下两个函数来实现:

  • cbind()
  • dplyr::bind_cols()

df1 <- data.frame(A=c('A0', 'A1', 'A2', 'A3'), B= c('B0', 'B1', 'B2', 'B3'), C= c('C0', 'C1', 'C2', 'C3'), D=c('D0', 'D1', 'D2', 'D3') ) df2 <- data.frame(E=c('A4', 'A5', 'A6', 'A7'), F= c('B4', 'B5', 'B6', 'B7'), G=c('C4', 'C5', 'C6', 'C7'), H= c('D4', 'D5', 'D6', 'D7')) df3 <-data.frame(I=c('A8', 'A9', 'A10', 'A11'), J= c('B8', 'B9', 'B10', 'B11'), K=c('C8', 'C9', 'C10', 'C11'), L=c('D8', 'D9', 'D10', 'D11') )

df1;df2;df3

mydata1<-cbind(df1,df2,df3);mydata1

mydata2<-dplyr::bind_cols(df1,df2,df3);mydata1

在Python中,简单的合并可以通过Pandas中的concat函数来实现的。

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}, index=[0, 1, 2, 3]) df2 = pd.DataFrame({'E': ['A4', 'A5', 'A6', 'A7'], 'F': ['B4', 'B5', 'B6', 'B7'], 'G': ['C4', 'C5', 'C6', 'C7'], 'H': ['D4', 'D5', 'D6', 'D7']}, index=[0, 1, 2, 3]) df3 = pd.DataFrame({'I': ['A8', 'A9', 'A10', 'A11'], 'J': ['B8', 'B9', 'B10', 'B11'], 'K': ['C8', 'C9', 'C10', 'C11'], 'L': ['D8', 'D9', 'D10', 'D11']}, index=[0, 1, 2, 3])

result1 = pd.concat([df1,df2,df3],axis=1,join_axes=[df1.index])

横向合并:(需匹配)

在R语言中,这种操作有很多可选方案,如基础函数merge、plyr包中的join函数以及dplyr包中的left/right/inter/full_join等函数。

  • merge
  • plyr::join
  • dplyr::left/right/inter/full_join

这里为了节省时间,只介绍第一种基础函数,欲了解详情,可以查看这篇历史文章:

R语言数据处理——数据合并与追加

merge(x, y, #带合并的数据集名称(左右顺序) by = intersect(names(x), names(y)), #合并依据字段(名称相同) by.x = by, #名称不同时需同时时声明 by.y = by, #名称不同时需同时时声明 all = FALSE,#合并类型,TRUE为全连接 (full),FALSE为内连接 (inter) all.x = all,#左连接 all.y = all,#右连接 )

df3<-data.frame(id=c(1001,1002,1003,1004,1005,1006,1007,1008), gender=c('male','female','male','female','male','female','male','female'), pay=c('Y','N','Y','Y','N','Y','N','Y'), m_point=c(10,12,20,40,40,40,30,20)) df4<-data.frame(id=c(1001,1002,1003,1004,1005,1006), city=c('Beijing ', 'Shenzhen','Guangzhou', 'Shenzhen', 'Shanghai','Beijing'), age=c(23,44,54,32,34,32), category=c('100-A','100-B','110-A','110-C','210-A','130-F'), price=c(1200,2900,2133,5433,1346,4432)) print(df3);print(df4)

mydata3<-merge(df3,df4,by="id",all=TRUE);print(mydata3) mydata3<-merge(df3,df4,by="id",all=FALSE);print(mydata3) mydata3<-merge(df3,df4,by="id",all.x=TRUE);print(mydata3) mydata3<-merge(df3,df4,by="id",all.y=TRUE);print(mydata3)

在Python中,这一操作也可以通过函数Pandas库中的cancat函数或者merge函数来完成。

Pandas-merge

df3=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006,1007,1008], "gender":['male','female','male','female','male', 'female','male','female'], "pay":['Y','N','Y','Y','N','Y','N','Y'], "m-point":[10,12,20,40,40,40,30,20]}) df4= pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006], "date":pd.date_range('20130102',periods=6), "city":['Beijing', 'Shenzhen','Guangzhou','Shenzhen','Shanghai','Beijing'], "age":[23,44,54,32,34,32], "category":['100-A','100-B','110-A','110-C','210-A','130-F'], "price":[1200,np.nan,2133,5433,np.nan,4432]}, columns =['id','date','city','category','age','price'])

print(df3);print(df4)

df_inner=pd.merge(df3,df4,how='inner');print(df_inner) #数据表合并(内连接:inter join) df_left=pd.merge(df3,df4, how='left') ;print(df_left) #数据表合并(左连接:left join) df_right=pd.merge(df3,df4,how='right');print(df_right) #数据表合并(右连接:right join) df_outer=pd.merge(df3,df4,how='outer');print(df_outer) #数据表合并(全连接:full join)

数据追加:

数据追加通常只需保证数据及的宽度一致且列字段名称一致,相对来说比较简单。在R语言和Python中,也很好实现。

在R语言中,可视化朱数据追加的函数有:

  • rbind()
  • dplyr::bind_rows()

mydata3<-rbind(df1,df2,df3);mydata3 mydata4<-dplyr::bind_rows(df1,df2,df3);mydata4

python中则可以很容易的通过数据框本身的append函数来实现简单的数据追加:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}, index=[0, 1, 2, 3]) df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'], 'B': ['B4', 'B5', 'B6', 'B7'], 'C': ['C4', 'C5', 'C6', 'C7'], 'D': ['D4', 'D5', 'D6', 'D7']}, index=[4,5,6,7]) df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'], 'B': ['B8', 'B9', 'B10', 'B11'], 'C': ['C8', 'C9', 'C10', 'C11'], 'D': ['D8', 'D9', 'D10', 'D11']}, index=[8, 9,10,11])

result = df1.append(df2);print(result)

result = result.append(df3);print(result)

如果是使用canat函数也可以非常轻松的完成数据追加:

result = pd.concat([df1, df2, df3]);print(result)

本文汇总:

数据合并(简单合并)

R:

cbind()

dplyr::bind_cols()

Python:

Pandas-cancat()

数据合并(匹配和并)

R:

merge

plyr::join()

dplyr::left/right/inter/full_join()

Python:

Pandas-merge

数据追加:

R:

rbind()

dplyr::bind_rows()

Python:

Pandas-append()

Pandas-cancat()

以上仅是个人常用的几种,方法肯定不至于此,欢迎大家补充!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据小魔方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档