微信号:shushuojun

介绍:数据分析师之家.旨在为数据人提供一个学习、分享、互帮互助的家园.

统计师的Python日记【第6天:数据合并】

2016-04-28 20:20 数说君


本文是【统计师的Python日记】第6天的日记


回顾一下:


第1天学习了Python的基本页面、操作,以及几种主要的容器类型。

第2天学习了python的函数、循环和条件、类。

第3天了解了Numpy这个工具库。

第4、5两天掌握了Pandas这个库的基本用法。


原文复习(点击查看):


【第1天:谁来给我讲讲Python?】


【第2天:再接着介绍一下Python呗】


【第3天:Numpy你好】


【第4天:欢迎光临Pandas】


【第四天的补充


【第5天:Pandas,露两手】


今天将带来第5天的学习日记。


目录如下:


前言


一、横向合并

1. 基本合并语句

2. 键值名不一样的合并

3. “两个数据列名字重复了”的合并


二、纵向堆叠




统计师的Python日记【第6天:数据合并】


前言


根据我的Python学习计划:


Numpy → Pandas 掌握一些数据清洗、规整、合并等功能 → 掌握类似与SQL的聚合等数据管理功能 → 能够用Python进行统计建模、假设检验等分析技能 → 能用Python打印出100元钱 → 能用Python帮我洗衣服、做饭 → 能用Python给我生小猴子......


前面我把一些基本内容都掌握了,从Python的安装到语句结构、从Numpy/Pandas的数据格式到基本的描述性统计,现在终于要进入一个“应用型”的学习——数据的合并。


其实,我对数据合并很有感情,当年我在某国家医学数据库里实习的时候,就经常用SAS对数据库进行各种合并,以查看受访者在不同数据库中的属性,可以说是使用率非常高的一个技能。


复习一下几种数据合并方式:左连接(left join)、右连接(right join)、内连接(inner join)、全连接(full join)。


  • 左连接(left join):以左边的表为基准表,将右边的数据合并过来。




  • 右连接(right join)以右边的表为基准表,将左边的数据合并过来。



  • 内连接(inner join):左边和右边都出现的数据才进行合并。



  • 全连接(full join):不管左边还是右边,只要出现的数据都合并过来。



以上的几种合并,都是按照姓名来合并的,两个表姓名一样,即将这条数据合并,这个姓名被称为键值,反正叫什么也无所谓,有一个变量被用来作为合并参照就可以了。


OK,今天将学习Python/Pandas的数据合并,合并是基于Pandas这个库,因此首先我们要导入库:import pandas as pd


准备工作完成,开始学习~



一、横向合并


1. 基本合并语句


我有两个数据:


  • D1 为某洗发店的会员数据,包括会员编号id和会员姓名name。


生成语句为:D1 = pd.DataFrame({'id':[801, 802, 803,804, 805, 806, 807, 808, 809, 810], 'name':['Ansel', 'Wang', 'Jessica', 'Sak','Liu', 'John', 'TT','Walter','Andrew','Song']})

 



  • D2为该洗发店本月的初值情况,可以看出,本月只有三位会员进行了储值。


生成语句为:D2 = pd.DataFrame({'id':[803, 804, 808,901], 'save': [3000, 500, 1200, 8800]})




现在我想将这两个表合并起来,即 “id-name-save” 的表,键值为id,基本语句为:merge(D1, D2, on='id')



哎,我记得合并有左连接、右连接等等,这里我什么也没指定,默认的貌似就是内连接(inner),D1中的801等好几个、D2中的901都没有被合并上,只合并了两个数据中都存在的。


好下面我来左连接,基本语句为:merge(D1, D2, on='id', how='left')




D1都被合并进来了,D2的901则没有。


再来一个右连接,基本语句为:merge(D1, D2, on='id', how='right')




右边的所有数据都被合并进来了。


全合并的基本语句为:merge(D1, D2, on='id', how='outer')




2. 键值名不一样的合并


刚刚的D1和D2,他们都有一个变量id,假如这个键值的名字不一样怎么办?一个叫“id1”、一个叫“id2”。




这种情况只要用 left_on= right_on= 分别指定两个键的名字即可,基本语句为:merge(D1, D2, left_on='id1', right_on='id2')




我有一个比较变态的问题:如果数据1的键值是变量id,数据2的键值是一个索引,该怎么合并?像这样:




也很简单,使用 left_index=True right_index=True,来声明某个数据的索引应该被当做键值,基本语句为:merge(D1, D2, left_on='id', right_index=True)




3. 两个数据的列名字重复了


如果两个数据有一样的变量名,那么合并会报错吗?举个例子,现在有803、804、808、901这四位会员3月的储值数据,数据名为D3Month



生成语句为:D3Month= pd.DataFrame({'id':[803, 804, 808, 901], 'save': [3000, 500, 1200, 8800]})


以及四月的储值数据,数据名为D4Month



生成语句为:D4Month= pd.DataFrame({'id':[803, 804, 808, 901], 'save': [0, 1500, 1000, 2000]})


现在想把两个表合并起来,但是两个数据都有save变量,合并之后会报错吗?来看一下吧~




没有报错,并且两个save自动打上了后缀,一个是_x,一个是_y,实际上,我们也可以自己加后缀,使用 suffixes=() 选项。比如,我将后缀变为:_3Month和_4Month,基本语句为:merge(D3Month, D4Month, on='id',how='left', suffixes=('_3Month', '_4Month’))





二、纵向堆叠


第一部分的内容学习的是将两个数据横向的合并,现在学习纵向合并——也叫做堆叠。比如,我们想象之前的会员数据,被分成了两个部分:


  • D1:



  • D2:




现在咱们再将这两个部分纵向的堆叠起来,注意对这类的堆叠问题,我在以后的日记中尽量不用“合并”这个词(而使用“堆叠”),以便和第一部分的merge区分开来。堆叠的基本语句为:concat([D1,D2])




这种情况我在之前的工作中也经常遇到,而且,常常会有这样的需求:堆叠起来的数据,能不能给个标志,标出哪部分来自D1,哪部分来自D2


肯定可以,用 keys=[ , ] 来标识出来,基本语句为:concat([D1,D2], keys=['D1', 'D2'] )




当然我们也可以横向堆叠,指定 axis=1,注意喽,虽然是横向,但不是合并(merge),仍然是堆叠,横向堆叠就是粗暴的将两个数据横向堆在一起,请看:




仍然可以用 keys=[] 来标识出那边来自D1、哪边来自D2,基本语句为:concat([D1,D2], axis=1, keys=['D1', 'D2'] )




后记:已经是第6天的日记分享给大家了,觉得好就打个赏吧,我再接着写。


查看数说工作室所有文章请在后台回复【M】




1. 关于数据分析的提问求助直接在微信后台留言。


2. 转载、投稿、免费发布招聘、合作,请加数说君个人微信AnselT,或Email:jiayounet@163.com。


数说工作室

数据分析师之家 | 金融 生物 零售 互联网

微信ID:shushuojun


长按二维码关注数说工作室

 
数说工作室 更多文章 导语:SAS正则表达式,统计师入门文本分析的捷径 讨论 | 数据分析的价值 日本 | 医疗大数据值得关注的3个方向
猜您喜欢 “大数据+技术管理”:机器管理码农的时代来了! 【投票】平安数据库审计平台即将来到你的身边 前端F4在南京谷歌开发者社区的精彩分享 Swift语言指南 网易杭州PD在招人,看过来咯~