python用merge匹配和左连接_左手用R右手Python系列——数据合并与追加

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

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

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

数据合并(匹配合并)

数据追加

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

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

cbind()

dplyr::bind_cols()

df1

B= c('B0', 'B1', 'B2', 'B3'),

C= c('C0', 'C1', 'C2', 'C3'),

D=c('D0', 'D1', 'D2', 'D3')

)

df2

F= c('B4', 'B5', 'B6', 'B7'),

G=c('C4', 'C5', 'C6', 'C7'),

H= c('D4', 'D5', 'D6', 'D7'))

df3

J= c('B8', 'B9', 'B10', 'B11'),

K=c('C8', 'C9', 'C10', 'C11'),

L=c('D8', 'D9', 'D10', 'D11')

)

df1;df2;df3

mydata1

mydata2

在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

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

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

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

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

mydata3

mydata3

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

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()

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据你的要求,我们需要在将BExcel的后三列追加到AExcel的A列和B列后面时,只将其添加到与BExcel中的D列和E列的值相等的A列和B列后面。具体步骤如下: 1. 安装pandas库 如果你已经安装过pandas库,则可以跳过这一步。否则在命令行中输入以下命令来安装pandas库: ``` pip install pandas ``` 2. 读取Excel文件 我们需要使用pandas的read_excel函数来读取Excel文件。假设BExcel文件名为"B.xlsx",AExcel文件名为"A.xlsx",则可以使用以下代码读取它们: ```python import pandas as pd # 读取BExcel文件 b_df = pd.read_excel('B.xlsx') # 读取AExcel文件 a_df = pd.read_excel('A.xlsx') ``` 3. 根据条件筛选数据 我们需要将BExcel的后三列数据追加到AExcel的A列和B列后面,但只添加到与BExcel中的D列和E列的值相等的A列和B列后面。这可以通过pandas的merge函数和DataFrame的boolean indexing来实现。具体代码如下: ```python # 根据BExcel的D列和E列的值筛选出符合条件的AExcel数据 merge_df = pd.merge(a_df, b_df[['D', 'E', 'Col1', 'Col2', 'Col3']], how='inner', left_on=['A', 'B'], right_on=['D', 'E']) # 获取BExcel的后三列数据 b_data = b_df.iloc[:, -3:] # 将BExcel的后三列数据追加到符合条件的AExcel的A列和B列后面 merge_df[['A', 'B']] = pd.concat([merge_df[['A', 'B']], b_data], axis=1) # 将修改后的数据保存回AExcel中 a_df.update(merge_df) ``` 4. 保存完整数据 最后,我们需要将修改后的完整数据保存回AExcel文件中。这可以通过pandas的to_excel函数来实现。具体代码如下: ```python # 将完整数据保存到AExcel文件中 a_df.to_excel('A.xlsx', index=False) ``` 完整代码如下: ```python import pandas as pd # 读取BExcel文件 b_df = pd.read_excel('B.xlsx') # 读取AExcel文件 a_df = pd.read_excel('A.xlsx') # 根据BExcel的D列和E列的值筛选出符合条件的AExcel数据 merge_df = pd.merge(a_df, b_df[['D', 'E', 'Col1', 'Col2', 'Col3']], how='inner', left_on=['A', 'B'], right_on=['D', 'E']) # 获取BExcel的后三列数据 b_data = b_df.iloc[:, -3:] # 将BExcel的后三列数据追加到符合条件的AExcel的A列和B列后面 merge_df[['A', 'B']] = pd.concat([merge_df[['A', 'B']], b_data], axis=1) # 将修改后的数据保存回AExcel中 a_df.update(merge_df) # 将完整数据保存到AExcel文件中 a_df.to_excel('A.xlsx', index=False) ``` 希望这个代码可以帮助你完成你的任务。如果你还有其他问题或者需要进一步的帮助,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值