首页 > 其他分享 >pandas数据合并merge

pandas数据合并merge

时间:2023-02-23 23:45:30浏览次数:33  
标签:name 合并 NaN merge 75 83 80 pandas

数据合并merge

#参数解释
merge(
        self,
        right: DataFrame | Series,
        how: str = "inner",#连接方式:‘inner’(默认);还有,‘outer’、‘left’、‘right’ 
        on: IndexLabel | None = None,#用于连接的列名,必须同时存在于左右两个DataFrame对象中,如果位指定,则以left和right列名的交集作为连接键 
        left_on: IndexLabel | None = None,#左侧DataFarme中用作连接键的列 
        right_on: IndexLabel | None = None,#右侧DataFarme中用作连接键的列
        left_index: bool = False,#将左侧的行索引用作其连接键
        right_index: bool = False,#将右侧的行索引用作其连接键
        sort: bool = False,
        suffixes: Suffixes = ("_x", "_y"),#字符串值元组,用于追加到重叠列名的末尾,默认为(‘_x’,‘_y’).例如,左右两个DataFrame对象都有‘data’,则结果中就会出现‘data_x’,‘data_y’ 
        copy: bool = True,
        indicator: bool = False,#会在结果中新增加一列来标明合并的结果是左右两边,还是仅在左边或仅在右边。参数为True时,新增列的标签为“_merge”当indicator=字符串时,返回的结果为字符串
        validate: str | None = None,
    )
  • merge的5种拼接方式inner/left/outer/right/cross

a = {"name":["lemon","jack","peter","Emma","james"],
     "city":["长沙","上海","深圳","北京","北京"],
     "a":[80,90,60,73,89],
     "b":[80,75,80,85,83],
     "c":[70,75,80,73,62]}
df1 = pd.DataFrame(data=a,index=["d","e","f","g","h"])
a2 = {"name":["lemon","jack","peter","jacob",],
      "city":["长沙","上海","深圳","北京"],
      "e":[85,92,70,83],
      "f":[83,75,82,87]}
df2 = pd.DataFrame(data=a2,index=["e","f","g","h"])

df1.merge(df2,left_on="name",right_on="name")#2个数据框中的“name”列中有相同元素值得数据行参与拼接,其他数据行不
# 参与拼接,同时在结果中其他列如有相同的列名称,则会以添加后缀的方式进行重命名,同时新的数据框的行索引标签会根据
# 行的数量进行重置

"""
#输出结果:
	name	city_x	a	b	c	city_y	e	f
0	lemon	长沙	80	80	70	长沙	85	83
1	jack	上海	90	75	75	上海	92	75
2	peter	深圳	60	80	80	深圳	70	82
"""

df1.merge(df2,left_on="name",right_on="name",how="outer")#并集方式呈现
"""
#输出结果
	name	city_x	a	b	c	city_y	e	f
0	lemon	长沙	80.0	80.0	70.0	长沙	85.0	83.0
1	jack	上海	90.0	75.0	75.0	上海	92.0	75.0
2	peter	深圳	60.0	80.0	80.0	深圳	70.0	82.0
3	Emma	北京	73.0	85.0	73.0	NaN	NaN	NaN
4	james	北京	89.0	83.0	62.0	NaN	NaN	NaN
5	jacob	NaN	NaN	NaN	NaN	北京	83.0	87.0
"""

df1.merge(df2,left_on="name",right_on="name",how="left")#只保留第一个的
"""
#输出结果
	name	city_x	a	b	c	city_y	e	f
0	lemon	长沙	80	80	70	长沙	85.0	83.0
1	jack	上海	90	75	75	上海	92.0	75.0
2	peter	深圳	60	80	80	深圳	70.0	82.0
3	Emma	北京	73	85	73	NaN	NaN	NaN
4	james	北京	89	83	62	NaN	NaN	NaN
"""

df1.merge(df2,how="cross")#此时不需要设置left_on与right_on,是将左右2个数据框的数据行以乘积的方式分别进行匹配
"""
name_x	city_x	a	b	c	name_y	city_y	e	f
0	lemon	长沙	80	80	70	lemon	长沙	85	83
1	lemon	长沙	80	80	70	jack	上海	92	75
2	lemon	长沙	80	80	70	peter	深圳	70	82
3	lemon	长沙	80	80	70	jacob	北京	83	87
4	jack	上海	90	75	75	lemon	长沙	85	83
5	jack	上海	90	75	75	jack	上海	92	75
6	jack	上海	90	75	75	peter	深圳	70	82
7	jack	上海	90	75	75	jacob	北京	83	87
8	peter	深圳	60	80	80	lemon	长沙	85	83
9	peter	深圳	60	80	80	jack	上海	92	75
10	peter	深圳	60	80	80	peter	深圳	70	82
11	peter	深圳	60	80	80	jacob	北京	83	87
12	Emma	北京	73	85	73	lemon	长沙	85	83
13	Emma	北京	73	85	73	jack	上海	92	75
14	Emma	北京	73	85	73	peter	深圳	70	82
15	Emma	北京	73	85	73	jacob	北京	83	87
16	james	北京	89	83	62	lemon	长沙	85	83
17	james	北京	89	83	62	jack	上海	92	75
18	james	北京	89	83	62	peter	深圳	70	82
19	james	北京	89	83	62	jacob	北京	83	87
"""

#也可以设置“on”参数
df1.merge(df2,on="name")
"""
	name	city_x	a	b	c	city_y	e	f
0	lemon	长沙	80	80	70	长沙	85	83
1	jack	上海	90	75	75	上海	92	75
2	peter	深圳	60	80	80	深圳	70	82
"""
#“on”参数也可以是列表
df1.merge(df2,on=["name","city"])#有图可知name与city中的重复值已经完全合并

"""
	name	city	a	b	c	e	f
0	lemon	长沙	80	80	70	85	83
1	jack	上海	90	75	75	92	75
2	peter	深圳	60	80	80	70	82
"""

#当结果中有列索引标签重复的数据列时,可以设置参数suffixes来对列索引标签添加后缀
df1.merge(df2,on = "name",suffixes=["_left","_right"])
"""
	name	city_left	a	b	c	city_right	e	f
0	lemon	长沙	80	80	70	长沙	85	83
1	jack	上海	90	75	75	上海	92	75
2	peter	深圳	60	80	80	深圳	70	82
"""

#如果有列索引标签重复时,可以设置参数suffixes为False,则会报错
df1.merge(df2,on = "name",suffixes=[False,False])
"""
df1.merge(df2,on = "name",suffixes=[False,False])
"""

#indicator参数,会在结果中新增加一列来标明合并的结果是左右两边,还是仅在左边或仅在右边。参数为True时,新增列的标签为“_merge”
df1.merge(df2,on = "name",how="outer",indicator=True)
"""

name	city_x	a	b	c	city_y	e	f	_merge
0	lemon	长沙	80.0	80.0	70.0	长沙	85.0	83.0	both
1	jack	上海	90.0	75.0	75.0	上海	92.0	75.0	both
2	peter	深圳	60.0	80.0	80.0	深圳	70.0	82.0	both
3	Emma	北京	73.0	85.0	73.0	NaN	NaN	NaN	left_only
4	james	北京	89.0	83.0	62.0	NaN	NaN	NaN	left_only
5	jacob	NaN	NaN	NaN	NaN	北京	83.0	87.0	right_only
"""

#当indicator=字符串时,返回的结果为字符串
df1.merge(df2,on = "name",how="outer",indicator="重复的列")
"""
name	city_x	a	b	c	city_y	e	f	重复的列
0	lemon	长沙	80.0	80.0	70.0	长沙	85.0	83.0	both
1	jack	上海	90.0	75.0	75.0	上海	92.0	75.0	both
2	peter	深圳	60.0	80.0	80.0	深圳	70.0	82.0	both
3	Emma	北京	73.0	85.0	73.0	NaN	NaN	NaN	left_only
4	james	北京	89.0	83.0	62.0	NaN	NaN	NaN	left_only
5	jacob	NaN	NaN	NaN	NaN	北京	83.0	87.0	right_only
"""

#merge还有另外一种形式为pandas.merge,下案例使用pd.merge,将左右两个数据框作为参数在函数中设置得到的结果与dataframe.merge是一样的
pd.merge(df1,df2,on=["name","city"],how="outer")
"""
	name	city	a	b	c	e	f
0	lemon	长沙	80.0	80.0	70.0	85.0	83.0
1	jack	上海	90.0	75.0	75.0	92.0	75.0
2	peter	深圳	60.0	80.0	80.0	70.0	82.0
3	Emma	北京	73.0	85.0	73.0	NaN	NaN
4	james	北京	89.0	83.0	62.0	NaN	NaN
5	jacob	北京	NaN	NaN	NaN	83.0	87.0
"""

#参数validate可以设置对齐方式,其值可以是“one_to_one”、“one_to_many”、“many_to_one”、“many_to_many”

pd.merge(df1,df2,on="city",how="outer",validate="many_to_one")

"""
name_x	city	a	b	c	name_y	e	f
0	lemon	长沙	80	80	70	lemon	85	83
1	jack	上海	90	75	75	jack	92	75
2	peter	深圳	60	80	80	peter	70	82
3	Emma	北京	73	85	73	jacob	83	87
4	james	北京	89	83	62	jacob	83	87
"""

pd.merge(df1,df2,on="city",how="outer")
"""
	name_x	city	a	b	c	name_y	e	f
0	lemon	长沙	80	80	70	lemon	85	83
1	jack	上海	90	75	75	jack	92	75
2	peter	深圳	60	80	80	peter	70	82
3	Emma	北京	73	85	73	jacob	83	87
4	james	北京	89	83	62	jacob	83	87
"""

#例子data3中"bought_by":[1,1,3]},[1,1,3]为data4中的行索引,将2个数据框连接起来
data3 = {"product":["computer","phone","TV"],"bought_by":[1,1,3]}
df3 = pd.DataFrame(data3,index=["A","B","C"])
data4 = {"name":["lemmon","jack","emma"],"age":[23,20,32]}
df4 = pd.DataFrame(data4,index=[1,2,3])


df3.merge(df4,how="inner",right_index=True,left_on="bought_by")#left_on 右侧DataFarme中用作连接键的列,right_index=True将右侧的行索引用作其连接键 

"""
	product	bought_by	name	age
A	computer	1	lemmon	23
B	phone	1	lemmon	23
C	TV	3	emma	32
"""

标签:name,合并,NaN,merge,75,83,80,pandas
From: https://www.cnblogs.com/yangzilaing/p/17149904.html

相关文章

  • 深入学习jquery源码之merge()和unique()
    深入学习jquery源码之merge()概述:合并两个数组到第一个数组上。返回的结果会修改第一个数组的内容——第一个数组的元素后面跟着第二个数组的元素。要去除重复项,请使用$.uni......
  • pandas常用命令
    基本操作(1)读取、写入csv文件pd.read_csv('file.csv')df.to_csv('file.csv',sep=',',index=False)#逗号分隔,不带索引(2)读取、写入excel文件pd.read_excel('file.xls......
  • pandas条件替换值(where&mask)
    pandas条件替换值(where&mask)在日常分析中,经常会遇到对数据的筛选处理相关的工作,我们可以使用loc和iloc定位分析筛选的列或行数据,下面介绍一种高级筛选的用法where和mask......
  • pandas
    seriespandasseries类似于表格中一个列(column),类似于一维数组,可以保存任何数据类型,series由索引(index)和列组成,函数如下:pandas.Series(data,index,dtype,name,copy)参数......
  • 在Pandas中通过时间频率来汇总数据的三种常用方法
    当我们的数据涉及日期和时间时,分析随时间变化变得非常重要。Pandas提供了一种方便的方法,可以按不同的基于时间的间隔(如分钟、小时、天、周、月、季度或年)对时间序列数据......
  • Pandas从SQL型数据库读写数据
    Pandas读写SQL型数据库主要用到pandas.read_sql()和DataFrame.to_sql()两个函数。read_sql()read_sql主要有如下几个参数:sql:SQL命令字符串con:连接sql数据库的......
  • IE和Microsoft Edge浏览器合并,如何设置单独打开IE
    IE和MicrosoftEdge浏览器合并,如何分离,单独打开注:最近系统更新,大家都有可能遇到打开IE时,会默认弹到MicrosoftEdge浏览器,这样会导致有些网页不能下载插件使用,兼容性太差,今......
  • Matplotlib中绘制双y轴合并图例
    转载自:https://www.cnblogs.com/atanisi/p/8530693.html1.绘制双y轴:twinx(),双x轴:twiny()#-*-coding:utf-8-*-importnumpyasnpimportmatplotlib.pyplotas......
  • 【GIT】git pull 报错:Exiting because of unfinished merge.
    报错如下:error:Youhavenotconcludedyourmerge(MERGE_HEADexists).hint:Please,commityourchangesbeforemerging.fatal:Exitingbecauseofunfinished......
  • acwing 合并集合
    题目一共有n个数,编号是1~n,最开始每个数各自在一个集合中。现在要进行m个操作,操作共有两种:Mab,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个......