引入
俗话说得好,做事和学习要循序渐进。pandas里面数据框整体操作还是非常重要的,上篇主要介绍的是最形象的数据框操作,而本期则偏重综合实践,介绍数据的连接。
希望能顶住压力,看完,相信多多少少会有收获。(我顶住压力写完也是一个挑战hhh)
一、准备工作
我们所用的第三方库和示例数据文件和上期一样。为了避免读者翻阅造成麻烦,这里重新展示导入操作,附带数据介绍,以方便初次阅读该文章的读者能很方便地读下去:
我们用到的包是pandas和numpy,我们用import方法直接导入,并将其重命名为熟悉的缩写。
数据我们选用的是某电商平台一定时期的用户行为数据,数据来源为该企业官方数据公开网。
数据说明
user列和brand列分别代表用户和品牌编号,不同用户不同品牌不重复,behavr列中0代表浏览,1代表购买,2代表收藏,3代表加入购物车,date列代表行为日期。
二、数据的连接意义
我们之前讲解的数据框基本操作是“合并”。表格的合并通常是基于列合并,即将一个数据框的每行记录并到另一个数据框最后一行下面。(当然也可以设置基于行合并,添加axis=1
参数即可)。
此时合并可以说基于的是同一种意义的数据。以基于列合并为例,比如我们这里的数据文件中有"brand"和“user”等数据的意义,分别代表品牌和用户。合并的时候另一个表的品牌和用户数据会并到前一个表的“brand”“user”列表下(若有不共有的列则空余位置用nan填充),相当于一种数据的 “新增” ——因为我们增加了brand和user的长度。
这一串相当于复习了,有需要例子的可以移步上期。
而实际合并操作中我们更多需要的不是“新增”式合并而是“整理”式合并。
比如我有一串用户数据,记录了用户id和购买的商品的id,还有一串商家数据,记录了商家id和售出商品的id。
现在我想开发一个智能推荐算法,需要看看用户一般买哪些商家的产品,好做后期推送。
那我该如何把这两个表连在一起呢?他们合并的依据不再是列名或者行的索引,而是数据中实实在在的数据值。
merge函数很好地解决了这个问题:
三、merge妙用一:一对一数据合并
首先我们创造两个示例数据框:
a2=pd.DataFrame([["001","104"],["002","101"],["003","103"],["004","102"]],columns=["user","items"]) #用户购买了商品
b2=pd.DataFrame([["s01","101"],["s02","103"],["s03","102"],["s04","104"]],columns=["seller","items"]) #商品属于商家
此处我们直接用DataFrame函数,嵌套二级表格创建。运行结果如下:
merge函数使用非常简单,传入两个dataframe参数即可:
pd.merge(a2,b2)
运行一下:
可以看出此时两个表已经通过items中的各个商品编号连接在了一起
四、merge妙用二:一对多数据合并
有的时候一个用户不止买了一个产品,两个数据表的数据量不对等,这个情况怎么办?
智能的merge函数会自动复制重复的内容。
举个例子,我们再制作一个一个用户买多个产品的数据框
a3=pd.DataFrame([["001","104"],["002","101"],["003","103"],["003","102"],["004","102"]],columns=["user","items"]) #假设某个用户购买了多个商品
此时我们继续使用merge函数连接a3和b2,依然能得到想要的结果:
五、数据不完全对等
这时候有朋友会问:那要是有互不相容的数据呢?
比如用户买了东西的记录有,而商家卖出的记录因丢失、存在别的表里等其他原因不在我想连接的表里。这个时候merge怎么处理这些情况?
答案是,默认会舍弃不一致的数据
b4=pd.DataFrame([["s01","101"],["s02","103"],["s05","105"],["s04","104"]],columns=["seller","items"]) #制作一个不一致数据的数据表
将这个数据表与a2连接,
我们发现数据直接被舍弃了。
tip:如果不希望舍弃的话,可以尝试设置how参数来自定义丢弃——都丢弃,还是保留一边(我们这里以保留左边为例)
参数的设置比较简单,见图即可
六、列标自定义
进行到这里,大家应该不难发现最后缺少的一步是什么了:
既然我们用merge函数是针对列中数据值的连接,那我们要合并的列名称本身应该可以自由选择指定才比较友好。
何出此言?
试想一下,其实针对一家企业来说,我们上面假设的“用户-商品”和“商品-商家”表格需要连接的情况并不常见
——因为在数据库内部本身就应该含有“用户-商品-商家”这样统一的数据。导出的时候不大会分开导出成两个表。
真的需要我们连接的,往往是企业与企业共享数据、企业并购企业等需要引入新数据的时候。这样两个数据表的接口(也就是我们上面例子中的列名称items)往往不相同,能指定列名进行合并才是正解!
的确,merge中提供了left_on
和right_on
参数来自定义合并的列:
b21=pd.DataFrame([["s01","101"],["s02","103"],["s03","102"],["s04","104"]],columns=["seller","id"]) b21 #创建商品的列标不一致的b21
接下来我们将其与a2连接,设置left_on right_on参数:
不难发现,连接是成了。但是两个不同名的列会产生重复。解决很简单,drop函数选择一个丢弃即可——
本期结语
数据框整体操作是个人感觉比较常用且需要理解的内容。因为你需要知道合并的逻辑——行合并?列合并?基于什么合并?……
到中期为止数据框整体的常用操作基本上已经讲解完毕了,欢迎各位读者纠错、指点。
下期我计划写一篇“矩阵特征值挖掘”相关的讲解,与大家一起看看数据框的合并能带来怎么样的数据分析火花。