dataframe 合并_超详细教程 | pandas合并之append和concat

dataframe 合并_超详细教程 | pandas合并之append和concat_第1张图片

​ 本篇文章主要介绍了pandas中对series和dataframe对象进行连接的方法:pd.append()和pd.concat(),文中通过示例代码对这两种方法进行了详细的介绍,希望能对各位python小白的学习有所帮助。

一、df.append(df)

描述:append方法用以在表尾中添加新的行,并返回追加后的数据对象,若追加的行中存在原数据没有的列,会新增一列,并用nan填充;若追加的行数据中缺少原数据某列,同样以nan填充

语法:df.append(other, ignore_index=False, verify_integrity=False, sort=None)

​ 参数说明:

  • other:要追加的数据,可以是dataframe,series,字典,列表
  • ignore_index:两个表的index是否有实际含义,默认为False,若ignore_index=True,表根据列名对齐合并,生成新的index
  • verify_integrity:默认为False,若为True,创建具有重复项的索引时引发ValueError
  • sort:默认为False,若为True如果’ self ‘和’ other '的列没有对齐,则对列进行排序。

下面对append方法的每个参数进行详细介绍:

​ 第一个参数为other:要追加的数据,可以是dataframe,series,字典,列表甚至是元素;但前后类型要一致。

  1. 将数据追加到series
# 将数据追加到series<<< a=df.iloc[0,:]<<< b=df.iloc[6,:]<<< a.append(b)      #需赋给新值,不改变原数组A     0B     1C     2D     3E     4F     5A    36B    37C    38D    39E    40F    41dtype: int32<<< aA    0B    1C    2D    3E    4F    5Name: S1, dtype: int32<<< c=a.append(b)    # 保存为c<<< cA     0B     1C     2D     3E     4F     5A    36B    37C    38D    39E    40F    41dtype: int32
  1. 将数据追加到dataframe
# 将数据追加到dataframe<<< a=df.iloc[0:2,:]<<< b=df.iloc[4:6,:] <<< c=a.append(b)           # 注意是纵向追加,不支持横向追加<<< c    ABCDE   FS1012345S267891011S5242526272829S6303132333435

​ 注意:获取单行得到的结果是一维数组,当一维数组[6,:]和二维数组[2,6]追加时,会得到8*7的数组,匹配不上的地方用NA填充。

# 将二维数组追加到一维数组<<< a=df.iloc[0,:]<<< b=df.iloc[4:6,:] <<< c=a.append(b)          <<< c      0  A  B  C  D  E  FA0.0NaNNaNNaNNaNNaNNaNB1.0NaNNaNNaNNaNNaNNaNC2.0NaNNaNNaNNaNNaNNaND3.0NaNNaNNaNNaNNaNNaNE4.0NaNNaNNaNNaNNaNNaNF5.0NaNNaNNaNNaNNaNNaNS5NaN24.025.026.027.028.029.0S6NaN30.031.032.033.034.035.0
  1. 将数据追加到list
  • list是一维:以列的形式来进行追加操作
  • list是二维:以行的形式来进行追加操作
  • list是三维:只添加一个值注意:追加到列表时,是在原数组改动,是在原数组改动,是在原数组改动
# 列表追加到列表<<< a=[]<<< b=df.iloc[6,:].tolist()<<< a.append(b)<<< a[[36, 37, 38, 39, 40, 41]]# 序列追加到列表<<< a=[1,2,3,4,5,6,7]<<< b=df.iloc[6,:]<<< a.append(b)<<< a[1, 2, 3, 4, 5, 6, 7, A    36 B    37 C    38 D    39 E    40 F    41 Name: S7, dtype: int32]
  1. 追加字典TypeError: Can only append a Series if ignore_index=True or if the Series has a name
<<< df1=pd.DataFrame()<<< a={'A':1,'B':2}<<< df1=df1.append(a,ignore_index=True)<<< df1    AB012
  1. 将单个元素追加到列表

​ append方法也可以将单个元素追加到列表(其他对象不行),会自动将单个元素转为列表对象,再进行追加操作

# 单个元素进行追加<<< a=[1,2,3,4,5,6,7,8]<<< a.append(9)<<< a[1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. 将其他类型对象追加到dataframe当dataframe使用append方法添加series或字典的时候,必须要设置name,设置name名称将会作为index的name,否则会报错提示:TypeError: Can only append a Series if ignore_index=True or if the Series has a name
<<< df1=pd.DataFrame()<<< ser=pd.Series({"x":1,"y":2},name="a")<<< df1=df1.append(ser)<<< df1    x   ya12

​ 如果不添加name,也可以添加参数ignore_index:

<<< df1=pd.DataFrame()<<< ser=pd.Series({"x":1,"y":2})<<< df1=df1.append(ser,ignore_index=True)<<< df1    x   ya12

​ 第二个参数:两个表的index是否有实际含义,默认ignore_index=False,若为True,表根据列名对齐合并,生成新的index。

<<< a=df.iloc[0:2,:]<<< b=df.iloc[4:6,:]<<< a.append(b,ignore_index=True)      A   BC   D   E   F001234516789101122425262728293303132333435<<< a=df.iloc[0:2,:]<<< b=df.iloc[4:6,:]<<< a.append(b)    ABCDE   FS1012345S267891011S5242526272829S6303132333435

​ 在dataframe中,使用append方法进行表合并时,二者匹配不上的地方用NAN填充。

<<< df1=df.copy()<<< df2=pd.DataFrame(np.arange(8).reshape(2,4),columns=<<

​ 第三个参数为verify_integrity:默认为False 参数用于检查结果对象新连接轴上的索引是否有重复项,有的话引发 ValueError,可以看到这个参数的作用与ignore_index 是互斥的。 (如果 ignore_index = True ,则意味着index不能是重复的,而ignore_index = False ,则意味着index可以是重复的)

<<< df1=df.copy()<<< df2=pd.DataFrame(np.arange(8).reshape(2,4),columns=   <<< ['G','H','I','J'],index=['S1','S8'],dtype=int)<<< pd.set_option('precision',0)<<< df_new=df1.append(df2,verify_integrity=False)<<< df_new    ABCDEFGHIJS1012345NaNNaNNaNNaNS267891011NaNNaNNaNNaNS3121314151617NaNNaNNaNNaNS4181920212223NaNNaNNaNNaNS5242526272829NaNNaNNaNNaNS6303132333435NaNNaNNaNNaNS7363738394041NaNNaNNaNNaNS1NaNNaNNaNNaNNaNNaN0123S8NaNNaNNaNNaNNaNNaN4567

注意:当需要连接的两个表的index有重复值时,设置ignore_index = True则会报错。

​ 第四个参数为sort:默认是False,该属性在pandas的0.23.0版本才有,若为True,则对两个表没匹配上的列名,进行排序,若为False,不排序。

<<< df1=pd.DataFrame(np.arange(8).reshape(2,4),columns=   <<< ['A1','B1','C1','D1'],index=['S1','S2'])<<< df2=pd.DataFrame(np.arange(8).reshape(2,4),columns=   <<< ['A2','B2','C2','D2'],index=['S1','S3'])<<< pd.set_option('precision',0)<<< df_new=df1.append(df2,sort=True)<<< df_new    A1A2B1B2C1C2D1D2S10NaN1NaN2NaN3NaNS24NaN5NaN6NaN7NaNS1NaN0NaN1NaN2NaN3S3NaN4NaN5NaN6NaN7

二、pd.concat([df_01,df_02])

描述:concat方法用以将两个或多个pandas对象根据轴(横向/纵向)进行拼接,concat函数是在pandas命名空间下的方法,因此需要通过pd.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’)

常用参数:

  • objs:要进行拼接的pandas对象,可用中括号[]将两个或多个对象括起来
  • axis:指定对象按照那个轴进行拼接,默认为0(纵向拼接),1为横向横向拼接
  • join:拼接的方式,inner为交集,outer为并集
  • join_axes:index的列表,仅在横向合并时使用,指明要将数据合并入哪个原表的index。
  • ignore_index:默认为False,如果设置为true,则无视表原来的轴标签,直接合并,合并后生成新的轴标签。
  • keys:表标识的列表,用来区分合并的表来自哪里。

下面,将对concat方法以上各个参数进行详细说明:

​ 第一个要学习的参数为objs:要进行拼接的pandas对象,可用中括号[]将两个或多个对象括起来。

1)对series进行拼接

<<< ser1=pd.Series(np.arange(9))<<< ser2=pd.Series(np.arange(9))# 对两个series对象进行拼接<<< pd.concat([ser1,ser2])0    01    12    23    34    45    56    67    78    80    01    12    23    34    45    56    67    78    8dtype: int32
  1. 对DataFrame进行拼接
<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['D','E','F'],index=['e','f','g'])# 对两个DataFrame对象进行拼接<<< pd.concat([df1,df2])    A   BCDE   Fa012NaNNaNNaNb345NaNNaNNaNc678NaNNaNNaNeNaNNaNNaN012fNaNNaNNaN345gNaNNaNNaN678

​ 第二个要学习的参数为axis:指定对象按照那个轴进行拼接,默认为0(纵向拼接),1为横向横向拼接。

<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['D','E','F'],index=['a','b','d'])# 将数据对象df1和df2沿1轴进行拼接,即进行横向拼接<<< pd.concat([df1,df2],axis=1)    ABCDEFa012012b345345c678NaNNaNNaNdNaNNaNNaN678

​ 注意:当对Series进行拼接时,设置axis=0进行纵向拼接的结果对象为Series,设置axis=1进行横向拼接的结果对象为DataFrame。

<<< ser1=pd.Series(np.arange(9))<<< ser2=pd.Series(np.arange(9))# 对Series进行拼接纵向拼接,结果认为Series对象<<< a=pd.concat([ser1,ser2],axis=0)<<< type(a)pandas.core.series.Series# 对Series进行拼接横向拼接,结果转换为DataFrame对象<<< b=pd.concat([ser1,ser2],axis=1)<<< type(b)pandas.core.frame.DataFrame

​ 第三个要学习的参数为join:拼接的方式,inner为交集,outer为并集,横向拼接时由index的交/并集决定,纵向拼接时由columns的交/并集决定,同时,如果join=outer,匹配不上的地方以nan填充。

<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['D','E','F'],index=['a','b','d'])# 将df1和df2进行横向合并,取二者的并集<<< pd.concat([df1,df2],axis=1)    ABCDEFa012012b345345c678NaNNaNNaNdNaNNaNNaN678# 将df1和df2进行横向合并,只取二者的交集<<< pd.concat([df1,df2],axis=1,join='inner')    ABCDEFa012012b345345

​ 第四个要学习的参数为join_axes:以哪个数据对象的index/columns作为轴进行拼接,当进行横向拼接时,join_axes为index的列表,如需根据df1对齐数据,则会保留df1的index,再将df2的数据进行拼接;同理,纵向拼接时为columns的列表。

<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['D','E','F'],index=['a','b','d'])# 根据df1的index对齐数据<<< pd.concat([df1,df2],axis=1,join_axes=[df1.index])    ABCDEFa012012b345345c678NaNNaNNaN# 根据df2的index对齐数据<<< pd.concat([df1,df2],axis=1,join_axes=[df2.index])    ABCDEFa012012b345345dNaNNaNNaN678

​ 第五个要学习的参数为ignore_index:默认为False,如果设置为true,则无视表原来的轴标签,直接合并,合并后生成新的轴标签。

​ 这里需要注意的是,与append方法只能进行纵向拼接不同,concat方法既可以进行横向拼接,也可以进行纵向拼接,若设置ignore_index=True,当进行横向拼接时,则无视原表的columns,直接合并,合并后生成默认的columns;同理,当进行纵向拼接时,则是忽略原表的index,生成新的index。

<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['D','E','F'],index=['a','b','d'])# 横向拼接时,忽略的是columns,index仍起作用<<< pd.concat([df1,df2],axis=1,ignore_index=True)    012345a012012b345345c678NaNNaNNaNdNaNNaNNaN678# 纵向拼接时,忽略的是index,columns仍起作用pd.concat([df1,df2],axis=0,ignore_index=True)    012345a012012b345345c678NaNNaNNaNdNaNNaNNaN678

​ 第六个要学习的参数为keys:表标识的列表,用来区分合并后的数据来源于哪个表,当ignore_index=True时,此参数的作用失效。

<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=   <<< ['D','E','F'],index=['a','b','d'])# 设置ignore_index=True时,参数keys不起作用<<< pd.concat([df1,df2],axis=1,ignore_index=True,keys=    <<< ['df1','df2'])    012345a012012b345345c678NaNNaNNaNdNaNNaNNaN678# 设置ignore_index=False,会根据keys的列表标识结果中的数据来源<<< pd.concat([df1,df2],axis=1,ignore_index=False,keys=   <<< ['df1','df2'])    df1        df2    ABCDEFa012012b345345c678NaNNaNNaNdNaNNaNNaN678

总结:

  • append方法只能进行横向拼接,且只支持对两个对象进行拼接操作,但append支持单个对象的连接,此方法常用于循环中;
  • concat方法可用于横向或纵向的拼接,同时可以设置以并集或交集的方式拼接

如对append和concat方法还感兴趣,建议可前往查看官方文档:

1)https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.append.html?highlight=append#pandas.DataFrame.append

2)pandas.concat - pandas 0.21.0 documentation

你可能感兴趣的:(dataframe,合并,dataframe两个表合并,dataframe合并,pandas,concat,pandas,concat函数,pandas,行合并)