微信公众号:《Python读钱》有问题或建议请留言存储,比如用表存储基本信息所有用户的,一张表用来存储用户的消费情况。因此,在日常的数据处理中,经常需要将两个表拼接在一起。这样的操作对应SQL中的join,Pandas中的merge。这篇文章会讲一下merge的主要原理。上面的介绍部分提到了merge是用来拼接两张表的,所以拼接的时候需要将用户信息一张一张拼接,所以拼接的两张表需要有一个共同的key来标识用户(key)。总结起来,整个合并过程就是一个信息一个一个匹配的过程。下面介绍四种类型的merge,分别是'inner','left','right'和'outer'。1.'inner'类型的innermerge称为innerjoin,在拼接过程中取两个表的键(keys)的交集进行拼接。这意味着什么?下面以图形化的方式一步步拆解。首先,我们有以下数据。左右数据分别代表用户的基本信息和消费信息。连接两个表的键是userid。现在使用'inner'方法mergeIn[6]:df_1.merge(df_2,how='inner',on='userid')Out[6]:useridagepayment0a2320001c323500流程图:①取两张表key的交集,其中df_1和df_2的userids的交集为{a,c}②对应匹配③结果过程总结:相信整个过程不难理解。上面的演示是同一个key,两张表对应只有一条数据的情况(一个用户对应一条消费记录),那么,如果一个用户对应多条消费记录,怎么拼接在一起呢?假设现在的数据变成如下。df_2中有两条数据对应a:同样使用inner方法合并:In[12]:df_1.merge(df_2,how='inner',on='userid')Out[12]:useridagepayment0a2320001a235002b4610003c323500除了对应的匹配阶段,整个过程和上面基本一致。过程图:①取两个表的key的交集,其中df_1和df_2的userids的交集为{a,b,c}②匹配时,由于这里a有两条对应的消费记录,拼接时,将用户基本信息表中a对应的数据多复制一行与右侧匹配。③结果2,left和right'left'和'right'的merge方式其实很相似,分别叫leftjoin和rightjoin。这两种方法可以相互转换,所以这里一并介绍。'left':合并时,以左表中的key作为配对的依据。如果左表中的键在右表中不存在,则用缺失值NaN进行填充。'right':合并时,以右表中的key作为配对的依据。如果右表中的键在左表中不存在,则用缺失值NaN进行填充。这意味着什么?用一个例子来详细解释一下,这是demo数据现在使用'left'方法mergeIn[21]:df_1.merge(df_2,how='left',on='userid')Out[21]:useridagepayment0a232000.01b46NaN2c323500.03d19NaN过程图:①根据左表中的所有键进行配对。图中,因为右表中的e不在左表中,所以不会进行配对。②如果将右表的payment列合并到左表中,对于没有匹配值的,使用缺失值NaN来填充流程总结:对于'right'类型的merge和'left'其实是类似的,只是把两个表的位置改一下,两个方法返回的结果是一样的(),如下:In[22]:df_2.merge(df_1,how='right',on='userid')Out[22]:useridpaymentage0a2000.0231c3500.0322bNaN463dNaN19至于'left'和'right'(甚至下面将介绍的'outer')之间连接的键是一个-to-many,原理和上面的'inner'类似,这里不再赘述。3.outer'outer'是outerjoin,在拼接的过程中会取两个表的键(keys)的并集进行拼接。
