DataFrame 数据合并,连接(merge,join,concat)

from:https://blog.csdn.net/zutsoft/article/details/51498026

https://blog.csdn.net/zhouwenyuan1015/article/details/77334889

merge  通过键拼接列,横向拼接

0. merge 函数参数

”’ 
merge: 合并数据集, 通过left, right确定连接字段,默认是两个数据集相同的字段 
参数 说明 
left 参与合并的左侧DataFrame 
right 参与合并的右侧DataFrame 
how 连接方式:‘inner’(默认);还有,‘outer’、‘left’、‘right’ 
on 用于连接的列名,必须同时存在于左右两个DataFrame对象中,如果位指定,则以left和right列名的交集作为连接键 
left_on 左侧DataFarme中用作连接键的列 
right_on 右侧DataFarme中用作连接键的列 
left_index 将左侧的行索引用作其连接键 
right_index 将右侧的行索引用作其连接键 
sort 根据连接键对合并后的数据进行排序,默认为True。有时在处理大数据集时,禁用该选项可获得更好的性能 
suffixes 字符串值元组,用于追加到重叠列名的末尾,默认为(‘_x’,‘_y’).例如,左右两个DataFrame对象都有‘data’,则结果中就会出现‘data_x’,‘data_y’ 
copy 设置为False,可以在某些特殊情况下避免将数据复制到结果数据结构中。默认总是赋值 

”’

1. merge合并的两个字段类型必须相同,如果不同会报错,可以使用astype转换成相同类型的字段。

2. merge的两个文件中如果有重复数据条目,merge的输出dataframe的数据条目会大于输入的dataframe。

1.merge默认按相同字段合并,且取两个都有的。

import pandas as pd
df1=pd.DataFrame({'name':['kate','herz','catherine','sally'],
                  'age':[25,28,39,35]})

df2=pd.DataFrame({'name':['kate','herz','sally'],
                  'score':[70,60,90]})
pd.merge(df1,df2)

”’ 
age name score 
0 25 kate 70 
1 28 herz 60 
2 35 sally 90

”’

2. 当左右连接字段不相同时,使用left_on,right_on

pd.merge(df1,df2,left_on="name",right_on='call_name')

”’ 
age name call_name score 
0 25 kate kate 70 
1 28 herz herz 60 
2 35 sally sally 90 
”’

3. 合并后,删除重复的列

pd.merge(df1,df2,left_on='name',right_on='call_name').drop('name',axis=1)

”’ 
age call_name score 
0 25 kate 70 
1 28 herz 60 
2 35 sally 90

”’

4.参数how的使用

“1)默认:inner 内连接,取交集”

pd.merge(df1,df2,on='name',how='inner')

”’ 
age name score 
0 25 kate 70 
1 28 herz 60 
2 35 sally 90 
”’ 
“2)outer 外连接,取并集,并用nan填充”

df3=pd.DataFrame({'name':['kate','herz','sally','cristin'],
                  'score':[70,60,90,30]})
pd.merge(df1,df3,on='name',how='outer')    

”’ 
age name score 
0 25 kate 70 
1 28 herz 60 
2 39 catherine NaN 
3 35 sally 90 
4 NaN cristin 30 
”’

“3)left 左连接, 左侧取全部,右侧取部分”

pd.merge(df1,df3,on='name',how='left')    

”’ 
age name score 
0 25 kate 70 
1 28 herz 60 
2 39 catherine NaN 
3 35 sally 90 
”’

“4) right 有连接,左侧取部分,右侧取全部”

pd.merge(df1,df3,on='name',how='right') 

”’ 
age name score 
0 25 kate 70 
1 28 herz 60 
2 35 sally 90 
3 NaN cristin 30 
”’

join 拼接列,主要用于索引上的合并


join方法提供了一个简便的方法用于将两个DataFrame中的不同的列索引合并成为一个DataFrame

[python]  view plain  copy
  1. join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False):  
其中参数的意义与merge方法基本相同,只是join方法默认为左外连接how=left

1.默认按索引合并,可以合并相同或相似的索引,不管他们有没有重叠列。

2.可以连接多个DataFrame

3.可以连接除索引外的其他列

4.连接方式用参数how控制

5.通过lsuffix='', rsuffix='' 区分相同列名的列

concat  可以沿着一条轴将多个对象堆叠到一起,默认用于纵向拼接

concat方法相当于数据库中的全连接(UNION ALL),可以指定按某个轴进行连接,也可以指定连接的方式join(outer,inner 只有这两种)。 与数据库不同的时concat不会去重,要达到去重的效果可以使用drop_duplicates方法

  1. concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,  
  2.           keys=None, levels=None, names=None, verify_integrity=False, copy=True):  
轴向连接 pd.concat() 就是单纯地把两个表拼在一起,这个过程也被称作连接(concatenation)、绑定(binding)或堆叠(stacking)。因此可以想见,这个函数的关键参数应该是 axis,用于指定连接的轴向。
在默认的  axis=0 情况下,pd.concat([obj1,obj2]) 函数的效果与 obj1.append(obj2) 是相同的;
而在  axis=1 的情况下,pd.concat([df1,df2],axis=1) 的效果与 pd.merge(df1,df2,left_index=True,right_index=True,how='outer') 是相同的。
可以理解为 concat 函数使用索引作为“连接键”。
本函数的全部参数为:
[python]  view plain  copy
  1. pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False)。  
objs 就是需要连接的对象集合,一般是列表或字典;
axis=0 是连接轴向join='outer' 参数作用于当另一条轴的 index 不重叠的时候,只有 'inner' 和 'outer' 可选(顺带展示 ignore_index=True 的用法)

concat 一些特点:

1.作用于Series时,如果在axis=0时,类似union。axis=1 时,组成一个DataFrame,索引是union后的,列是类似join后的结果。

2.通过参数join_axes=[] 指定自定义索引。

3.通过参数keys=[] 创建层次化索引

4.通过参数ignore_index=True 重建索引。

[python]  view plain  copy
  1. In [5]: df1=DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])  
  2.   
  3. In [6]: df2=DataFrame(np.random.randn(2,3),columns=['b','d','a'])  
  4.   
  5. In [7]: pd.concat([df1,df2])  
  6. Out[7]:   
  7.           a         b         c         d  
  8. 0 -0.848557 -1.163877 -0.306148 -1.163944  
  9. 1  1.358759  1.159369 -0.532110  2.183934  
  10. 2  0.532117  0.788350  0.703752 -2.620643  
  11. 0 -0.316156 -0.707832       NaN -0.416589  
  12. 1  0.406830  1.345932       NaN -1.874817  
[python]  view plain  copy
  1. In [8]: pd.concat([df1,df2],ignore_index=True)  
  2. Out[8]:   
  3.           a         b         c         d  
  4. 0 -0.848557 -1.163877 -0.306148 -1.163944  
  5. 1  1.358759  1.159369 -0.532110  2.183934  
  6. 2  0.532117  0.788350  0.703752 -2.620643  
  7. 3 -0.316156 -0.707832       NaN -0.416589  
  8. 4  0.406830  1.345932       NaN -1.874817  



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/you_xian/article/details/51498026


你可能感兴趣的:(python)