Pandas 合并数据集

来源:互联网 发布:软件页面设计规范 编辑:程序博客网 时间:2024/06/06 05:33

转载出处:http://blog.csdn.net/u010414589/article/details/51135840

在数据挖掘过程中,经常会有不同表格的数据需要进行合并操作。今天介绍通过Python下的pandas库下的merge方法和concat方法来实现数据集的合并。

1.merge

merge 函数通过一个或多个键来将数据集的行连接起来。该函数的主要 应用场景是针对同一个主键存在两张包含不同特征的表,通过该主键的连接,将两张表进行合并。合并之后,两张表的行数没有增加,列数是两张表的列数之和减一。 
函数的具体参数为:

merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,suffixes=('_x','_y'),copy=True)
  • 1
  • 2
  • 1
  • 2
  • on=None 指定连接的列名,若两列希望连接的列名不一样,可以通过left_on和right_on 来具体指定
  • how=’inner’,参数指的是左右两个表主键那一列中存在不重合的行时,取结果的方式:inner表示交集,outer 表示并集,left 和right 表示取某一边。 
    举例如下
import pandas as pddf1 = pd.DataFrame([[1,2,3],[5,6,7],[3,9,0],[8,0,3]],columns=['x1','x2','x3'])df2 = pd.DataFrame([[1,2],[4,6],[3,9]],columns=['x1','x4'])print df1print df2df3 = pd.merge(df1,df2,how = 'left',on='x1')print df3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里我分别设置了两个DataFrame类别的变量df1,df2,(平常我们用的表csv文件,读取之后也是DataFrame 格式)。然后我设置 on=’x1’,即以两个表中的x1为主键进行连接,设置how=’left’ ,即是以两个表中merge函数中左边那个表的行为准,保持左边表行数不变,拿右边的表与之合并。结果如下:

片描述 
第一个结果为how=’left’的情况。第二个结果为how=’inner’的情况。 
注意:在how=’left’设置后,左边行之所以能够保持不变,是因为右边的表主键列没有重复的值,x下面我会举个例子作为思考题: 
这里写图片描述 
这是两张表,分别为df1,df2;

第一个问题: 
在默认情况下即merge(df1,df2)其他参数为默认值的返回结果是 什么? 
第二个问题: 
在加上how=’left’之后的返回结果是什么? 
看完了问题之后,返回去看这两张表,不着急看答案,仔细想想。

这里写图片描述

这两个问题明白之后,表之间的连接和映射应该都能够明白了。

2.concat

concat 与其说是连接,更准确的说是拼接。就是把两个表直接合在一起。于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis 。 
函数的具体参数是:

concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verigy_integrity=False)
  • 1
  • 1
  • objs 是需要拼接的对象集合,一般为列表或者字典
  • axis=0 是行拼接,拼接之后行数增加,列数也根据join来定,join=’outer’时,列数是两表并集。同理join=’inner’,列数是两表交集。

在默认情况下,axis=0为纵向拼接,此时有

concat([df1,df2]) 等价于 df1.append(df2)
  • 1
  • 1

在axis=1 时为横向拼接 ,此时有

concat([df1,df2],axis=1) 等价于 merge(df1,df2,left_index=True,right_index=True,how='outer')
  • 1
  • 1

举个例子

import pandas as pddf1 = pd.DataFrame({'key':['a','a','b','b'],'data1':range(4)})print df1df2 = pd.DataFrame({'key':['b','b','c','c'],'data2':range(4)})print df2print pd.concat([df1,df2],axis=1)print pd.merge(df1,df2,left_index=True,right_index=True,how='outer')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这里写图片描述

0 0
原创粉丝点击