concat合并数据集的实例讲明,合并多个Dataframe

作者: 韦德国际1946手机版  发布:2019-05-28

在数额管理的时候,越发在搞大额比赛的时候时临时会超过一个主题材料即便,八个表单的会面难题,举例三个表单有user_concat合并数据集的实例讲明,合并多个Dataframe。id和age这多个字段,另叁个表单有user_id和sex那多少个字段,要把那五个表合并成唯有user_id、age、sex多个字段的表怎么做的,普通的拼凑是做不到的,因为user_id每1行之间不是应和的,像拼积木似的横向拼接确定是丰裕的。

Merge

数码规整化:合并、清理、过滤

pandas的拼接分为二种:

pandas中有个merge函数能够变成这些实用的效应,merge这几个词会点SQL语言的应有都不面生。

一 首先建设构造四个新的DataFrame

import pandas as pd 
import numpy as np 

df1=pd.DataFrame({'key':['a','b','c','d','e'],'data2':np.arange(5)})
df2=pd.DataFrame({'key':['a','b','c'],'data1':np.arange(3)})

In [238]: df1
Out[238]: 
   data1 key
0      0   a
1      1   b
2      2   c
3      3   d
4      4   e

In [239]: df2
Out[239]: 
   data1 key
0      0   a
1      1   b
2      2   c 

pandas和python标准库提供了壹整套高级、灵活的、高效的骨干函数和算法将数据规整化为您想要的花样!

  • 级联:pd.concat, pd.append
  • 合并:pd.merge, pd.join

下边说说merge函数怎么用:

二 使用merge函数合并

data=pd.merge(df1,df2,on='key',how='left')

示范如下:

In [30]: data=pd.merge(df1,df2,on='key',how='left')
In [31]: data
Out[31]: 
   data2 key  data1
0      0   a    0.0
1      1   b    1.0
2      2   c    2.0
3      3   d    NaN
4      4   e    NaN

通过indicator申明merge的方法(这几个意义日常工作中本人相比较少用)

In [32]: data=pd.merge(df1,df2,on='key',how='left',indicator=True)
In [33]: data
Out[33]: 
   data2 key  data1     _merge
0      0   a    0.0       both
1      1   b    1.0       both
2      2   c    2.0       both
3      3   d    NaN  left_only
4      4   e    NaN  left_only

当八个数据会集并的列名不雷同不经常间用 left_on,right_on

df1=df1.rename(columns={'key':'key1'})
data=pd.merge(df1,df2,left_on='key1',right_on='key',how='left')

In [60]: data
Out[60]: 
   data2 key1  data1  key
0      0    a    0.0    a
1      1    b    1.0    b
2      2    c    2.0    c
3      3    d    NaN  NaN
4      4    e    NaN  NaN

data数据集将五个列名不1致的数据统壹在1块了!
注:merge函数暗中认可连接格局是inner,其它有left,right,outer等

本篇博客首要介绍:

一.回顾numpy.concatenate

生成1个6*3的矩阵,一个2*3的矩阵,对其分别实行四个维度上的级联

nd1 = np.random.randint(0,150,size = nd2 = np.random.randint(0,150,size = np.concatenate)np.concatenate([nd1,nd2])

图片 1

df = pd.merge(df1, df2, how='left', on='user_id') 

3 多多少会集并

是对准合并后的多寡再统1,不是叁回性统壹多少个数据集

df1=pd.DataFrame({'key':['a','b','c','d','e'],'data1':np.arange(5)})
df2=pd.DataFrame({'key':['a','b','c'],'data2':np.arange(3)})
df3=pd.DataFrame({'key':['a','b','c','d'],'data3':np.arange(4)})

data=pd.merge(pd.merge(df1,df2,on='key',how='left'),df3,on='key',how='left')
In [55]: data
Out[55]: 
   data1 key  data2  data3
0      0   a    0.0    0.0
1      1   b    1.0    1.0
2      2   c    2.0    2.0
3      3   d    NaN    3.0
4      4   e    NaN    NaN

统一数据集:.merge()、.concat()等方法,类似于SQL或别的关系型数据库的连天操作。

二. concat

pandas使用pd.concat函数,与np.concatenate函数类似,只是多了部分参数:

参数:

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False)

参数表达:

objs: series,dataframe恐怕是panel构成的行列lsit
axis: 需求统一链接的轴,0是行,壹是列 ,默许axis=0
join:连接的章程 inner,也许outer

用法很轻巧,说一下后七个参数即可了,how=""参数表示以哪个表的key为准,上边的how="left"表示以表df一为准,而key也正是on=""的参数

四 多规格合并

df1=pd.DataFrame({'key':['a','b','c','d','e'],'key1': 
      ['one','one','two','one','two'],'data1':np.arange(5)})
df2=pd.DataFrame({'key':['a','b','c'],'key1': 
      ['one','one','two'],'data2':np.arange(3)})

data=pd.merge(df1,df2,on=['key','key1'],how='left')

In [57]: data
Out[57]: 
   data1 key key1  data2
0      0   a  one    0.0
1      1   b  one    1.0
2      2   c  two    2.0
3      3   d  one    NaN
4      4   e  two    NaN

备注:须求注意的是应用merge合并时,五个数据集的合并条件类型须1致。

联合数据集

1.一样字段的表首尾相接

图片 2

# 现将表构成list,然后在作为concat的输入frames = [df1, df2, df3] result = pd.concat

要在不停的时候在丰富三个档期的顺序的key来辨别数据源自于哪张表,能够追加key参数  

result = pd.concat(frames, keys=['x', 'y', 'z'])  

职能如下:

图片 3

how="left"就是说,保留user_id字段的成套音信,不扩展也不减弱,不过拼接的时候只把df贰表中的与df第11中学user_id字段交集的有的联合上就足以了,若是df第22中学冒出了有个别user_id在df第11中学从未出现,就丢掉掉这几个样本不作管理。

Concat(类似numpy的concatenate)

统一五个数据集,可在行依旧列上合并(axis)

#默认情况下axis=0 

data=pd.concat([df1,df2])
data1=pd.concat([df1,df2],axis=1)

In [13]: data=pd.concat([df1,df2])

In [14]: data
Out[14]: 
   data1  data2 key
0    NaN    0.0   a
1    NaN    1.0   b
2    NaN    2.0   c
3    NaN    3.0   d
4    NaN    4.0   e
0    0.0    NaN   a
1    1.0    NaN   b
2    2.0    NaN   c

ignore_index 不保留原本连接轴上的目录,生成一组新索引

In [74]: data=pd.concat([df1,df2],ignore_index=True)

In [75]: data
Out[75]: 
   data1  data2 key
0    NaN    0.0   a
1    NaN    1.0   b
2    NaN    2.0   c
3    NaN    3.0   d
4    NaN    4.0   e
5    0.0    NaN   a
6    1.0    NaN   b
7    2.0    NaN   c

#纵向合并(axis=1是列)

In [15]: data1=pd.concat([df1,df2],axis=1)

In [16]: data1
Out[16]: 
   data2 key  data1  key
0      0   a    0.0    a
1      1   b    1.0    b
2      2   c    2.0    c
3      3   d    NaN  NaN
4      4   e    NaN  NaN

多少个数据集结并时 data一=pd.concat([df1,df2,....])

keys 能够剖断数据出自哪个数据集,生成三个多重索引。

In [36]: data=pd.concat([df1,df2],keys=[0,1])

In [37]: data
Out[37]: 
     data1  data2 key
0 0    NaN    0.0   a
  1    NaN    1.0   b
  2    NaN    2.0   c
  3    NaN    3.0   d
  4    NaN    4.0   e
1 0    0.0    NaN   a
  1    1.0    NaN   b
  2    2.0    NaN   c

一) merge 函数参数

2. 横向表拼接

有两种级联形式:

  • 外连接:补NaN
  • 内连接:只连接相配的项
  • 总是钦命轴:join_axes

如果要拓展多key合并:

Join

目录上的统1,是充实列而不是充进行

df3=pd.DataFrame([[1,2],[3,4],[5,6]],index=['a','b','c'],columns=['ao','bo'])
df4=pd.DataFrame([[7,8],[9,10],[10,12]],index=['e','b','c'],columns=['aoe','boe'])

df3.join(df4,how='outer')

In [38]: df3.join(df4,how='outer')
Out[38]: 
  ao   bo   aoe   boe
a  1.0  2.0   NaN   NaN
b  3.0  4.0   9.0  10.0
c  5.0  6.0  10.0  12.0
e  NaN  NaN   7.0   8.0

当合并的多寡表列名字如出壹辙,通过lsuffix='', rsuffix='' 区分同样列名的列

df5=pd.DataFrame([[7,8],[9,10],[10,12]],index=['e','b','c'],columns=['aoe','boe'])
df6=pd.DataFrame([[7,8],[9,10],[10,12]],index=['e','b','c'],columns=['aoe','boe'])

In [43]: df5.join(df6,how='outer',lsuffix='_l', rsuffix='_r')
Out[43]: 
   aoe_l  boe_l  aoe_r  boe_r
e      7      8      7      8
b      9     10      9     10
c     10     12     10     12
参数 说明
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,可以在某些特殊情况下避免将数据复制到结果数据结构中。默认总是赋值

axis

当axis = 一的时候,concat正是行对齐,然后将不一样列名称的两张表合并

result = pd.concat([df1, df4], axis=1)

图片 4

df = pd.merge(df1, df2, how='left', on=['user_id','sku_id']) 

Combine_first

若df七的多寡远远不足,则用df捌的数据值填充df1的数据值

df7 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan],[np.nan, 7., np.nan]])
df8 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]], index=[1, 2])

In [61]: df7.combine_first(df8)
Out[61]: 
     0    1    2
0  NaN  3.0  5.0
1 -4.6  NaN -8.2
2 -5.0  7.0  4.0

1、多对壹的联合(三个表的连天键列有重复值,另2个表中的连接键未有重复值)

join

丰硕join参数的习性,如果为’inner’得到的是两表的混合,若是是outer,获得的是两表的并集。

result = pd.concat([df1, df4], axis=1, join='inner')

图片 5

唯独若是想仅实行简易的“拼接”而不是联合呢,要运用concat函数:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1': range(7)})

df1

join_axes

如果有join_axes的参数字传送入,能够钦点依照那多少个轴来对齐多少
诸如依照df1表对齐多少,就能保留内定的df一表的轴,然后将df4的表与之拼接

result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])

图片 6

df = pd.concat( [df_user, dummies_sex, dummies_age, dummies_level], axis=1 ) 
data1 key
0 0 b
1 1 b
2 2 a
3 3 c
4 4 a
5 5 a
6 6 b

3. append

append是series和dataframe的章程,使用它正是私下认可沿着列进行依附(axis = 0,列对齐)

result = df1.append

图片 7

那样能够保存那么些表单的全体音讯,参数axis=一表示列拼接,axis=0表示行拼接。

df2 = pd.DataFrame({'key':['a','b','d'],'data2':range(3)})

df2

4. 无视index的concat

一经五个表的index都未曾实际意义,使用ignore_index参数,置true,合并的三个表正是基于列字段对齐,然后合并。最终再重新整理八个新的index。

图片 8

要确认保障背个表单的行数是平等的,并且每壹行对应的key也是完全一样的,列拼接才变得有意义

data2 key
0 0 a
1 1 b
2 2 d

5. 联结的还要扩大区分数据组的键

方今提到的keys参数能够用来给合并后的表扩充key来区分分歧的表数据来源

如上那篇Pandas 合并多少个Dataframe(merge,concat)的点子正是我分享给大家的全体内容了,希望能给大家二个参照,也期待我们多多帮忙脚本之家。

pd.merge(df1,df2)#默认情况

能够直接用key参数达成

result = pd.concat(frames, keys=['x', 'y', 'z'])

图片 9

你恐怕感兴趣的篇章:

  • python merge、concat合并数据集的实例解说
  • python pandas dataframe 按列可能按行合并的秘技
  • python pandas中DataFrame类型数据操作函数的措施
  • 对numpy和pandas中数组的集合和拆分详解
  • pandas string转dataframe的方法
  • 使用pandas对两个dataframe进行join的实例
data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0

传播字典来扩充足组键

pieces = {'x': df1, 'y': df2, 'z': df3}result = pd.concat

图片 10

df1.merge(df2)

六. 在dataframe中进入新的行

append方法能够将 series 和 字典的数码作为dataframe的新1行插入。

s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D'])result = df1.append(s2, ignore_index=True)

图片 11

data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0

七. 表格列字段不相同的表合并

只要赶上两张表的列字段本来就不等同,但又想将三个表合并,个中无效的值用nan来代表。那么能够动用ignore_index来实现。

dicts = [{'A': 1, 'B': 2, 'C': 3, 'X': 4}, {'A': 5, 'B': 6, 'C': 7, 'Y': 8}]result = df1.append(dicts, ignore_index=True)

图片 12

df1.merge(df2,on = 'key',how = 'inner')#内连接,取交集

三. merge()

merge的参数

  • on:列名,join用来对齐的那1列的名字,用到那个参数的时候一定要力保左表和右表用来对齐的那一列都有同样的列名。
  • left_on:左表对齐的列,能够是列名,也得以是和dataframe同样长度的arrays。
  • right_on:右表对齐的列,能够是列名,也足以是和dataframe一样长度的arrays。
  • left_index/ right_index: 假使是True的haunted以index作为对齐的key
  • how:数据融入的法子。
  • sort:遵照dataframe合并的keys按字典顺序排序,私下认可是,假若置false能够加强表现。

merge的默认合并方法:merge用于表内部基于 index-on-index 和 index-on-column 的汇合,但暗许是依照index来统一。

data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0

一. 通过on钦赐数量统一对齐的列

result = pd.merge(left, right, on=['key1', 'key2']) #left#只保留左表的所有数据result = pd.merge(left, right, how='left', on=['key1', 'key2']) #right#保留右表的所有数据result = pd.merge(left, right, how='right', on=['key1', 'key2']) #outer#保留两个表的所有信息result = pd.merge(left, right, how='outer', on=['key1', 'key2']) #inner#只保留两个表中公共部分的信息result = pd.merge(left, right, how='inner', on=['key1', 'key2'])
df1.merge(df2,on = 'key',how = 'outer')#外链接,取并集,并用nan填充

2. join方法

dataframe内置的join方法是一种高效合并的诀窍。它暗中同意以index作为对齐的列。

data1 key data2
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 3.0 c NaN
7 NaN d 2.0

how参数

join中的how参数和merge中的how参数一样,用来钦赐表合并保存数据的条条框框。

df1.merge(df2,on = 'key',how = 'left')#左连接,左侧DataFrame取全部,右侧DataFrame取部分

on参数

在其实使用中只要右表的索引值就是左表的某壹列的值,那时可以经过将 右表的目录和左表的列对齐合并那样灵活的法门实行合并。

result = left.join(right, on='key')
data1 key data2
0 0 b 1.0
1 1 b 1.0
2 2 a 0.0
3 3 c NaN
4 4 a 0.0
5 5 a 0.0
6 6 b 1.0

suffix后缀参数

假如和表合并的历程中遇见有一列三个表都同名,可是值不一样,合并的时候又都想保留下来,就足以用suffixes给每种表的再一次列名扩展后缀。

result = pd.merge(left, right, on='k', suffixes=['_l', '_r'])
df1.merge(df2,on = 'key',how = 'right')#右连接,右侧DataFrame取全部,左侧DataFrame取部分

三. 结缘四个dataframe

壹次组合多少个dataframe的时候能够流传成分为dataframe的列表恐怕tuple。叁遍join多个,贰回解决多次相当的慢~

result = left.join([right, right2])

merge与concat的区别在于,merge须求基于某一联机的行或列来开始展览联合

利用pd.merge()合并时,会自动依照双边毫发不爽column名称的那一列,作为key来开始展览联合。注意每一列成分的一一无需一律

df_id = DataFrame({'id':[1,2,3,4]},index = listdf_id df2 = DataFrame(np.random.randint(0,150,size=,index=list,columns=['语文','政治','历史'])df2 = pd.concat([df2,df_id],axis = 1)df2

 图片 13

data1 key data2
0 0.0 b 1
1 1.0 b 1
2 6.0 b 1
3 2.0 a 0
4 4.0 a 0
5 5.0 a 0
6 NaN d 2

一对一统1

# merge 默认情况下,列增加了df1.merge

图片 14图片 15

图片 16

如若左右边DataFrame的连接键列名不一致,可是取值有重叠,可使用left_on、right_on来内定左右连接键

多对一联结

本文由韦德国际1946发布于韦德国际1946手机版,转载请注明出处:concat合并数据集的实例讲明,合并多个Dataframe

关键词: concat pd join