Pandas从入门到精通(6)- 连接

1. 课程内容

SQL中最常见的操作莫过于将好几张表连接(JOIN)起来查看某些字段,与之类似,Pandas具有功能全面且性能强大连接操作。而且因为我们的DataFrame中有列-columns和索引-index。在Pandas中的连接操作感觉比SQL中要丰富的多。
本期我们就来串一串这些连接方法,主要有:

  • 关系型连接
    • 针对列进行的merge 方法
    • 针对索引的join方法
  • 方向连接
    • 横向或者纵向拼接-concat方法
    • 其他append/assign方法
      这些方法大部分的参数都类似,实际操作中最常用的是merge和concat
      下面我们将主要精力放在这两个函数上

1.1 merge

merge()函数 基本语法:
pd.merge(df1, df2, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True)
其中:

  • df1,df2为需要merge的两张表(DataFrame)
  • on - 列(名称)连接,必须在左(df1)和右(df2)DataFrame对象中存在(找到)。
  • left_on - 左侧DataFrame中的列用作键,可以是列名或长度等于DataFrame长度的数组。
  • right_on - 来自右的DataFrame的列作为键,可以是列名或长度等于DataFrame长度的数组。
    left_index - 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 在具有MultiIndex(分层)的DataFrame的情况下,级别的数量必须与来自右DataFrame的连接键的数量相匹配。
  • right_index - 与右DataFrame的left_index具有相同的用法。
  • sort - 按照字典顺序通过连接键对结果DataFrame进行排序。默认为True,设置为False时,在很多情况下大大提高性能。
  • how - 它是left, right, outer以及inner之中的一个,默认为内inner。 含义分别是左连接 left 、右连接 right 、内连接 inner 、外连接 outer ,它们的区别可以用如下示意图表示:
image.png

使用merge时,如果没有指定 on = 哪一列,则默认以重叠列名当做链接键, 当然也可以按照多键连接,只需要'on'参数后传入多键列表即可。

1.2 join索引连接

在上面的Merge中,主要是针对columns进行连接,如果在merge中指定on = index, 即按照索引来连接,是否可以呢?答案是可以的。但是这种情况最好直接用join来做。pandas 中利用 join 函数来处理索引连接,它的参数选择要少于 merge ,除了必须的 on 和 how 之外,可以对重复的列指定左右后缀 lsuffix 和 rsuffix 。其中, on 参数指索引名,单层索引时省略参数表示按照当前索引连接。

1.3 方向连接concat

前面介绍了关系型连接,其中最重要的参数是 on 和 how ,但有时候用户并不关心以哪一列为键来合并,只是希望把两个表或者多个表按照纵向或者横向拼接,为这种需求, pandas 中提供了 concat 函数来实现。
在 concat 中,最常用的有三个参数,它们是 axis, join, keys ,分别表示拼接方向,连接形式,以及在新表中指示来自于哪一张旧表的名字。这里需要特别注意, join 和 keys 与之前提到的 join 函数和键的概念没有任何关系。

在默认状态下的 axis=0 ,表示纵向拼接多个表,常常用于多个样本的拼接;而 axis=1 表示横向拼接多个表,常用于多个字段或特征的拼接。

1.4 其他连接操作

其他类似的连接操作还有append,combine等,比较简单,这里不在介绍

2. 作业练习题

1:美国疫情数据集

现有美国4月12日至11月16日的疫情报表,请将 New YorkConfirmed, Deaths, Recovered, Active 合并为一张表,索引为按如下方法生成的日期字符串序列:

date = pd.date_range('20200412', '20201116').to_series()

In [62]: date = date.dt.month.astype('string').str.zfill(2
   ....:        ) +'-'+ date.dt.day.astype('string'
   ....:        ).str.zfill(2) +'-'+ '2020'
   ....: 

In [63]: date = date.tolist()

In [64]: date[:5]
Out[64]: ['04-12-2020', '04-13-2020', '04-14-2020', '04-15-2020', '04-16-2020']

解答:
第一步查看原始数据。原始数据存在一个文件夹中,每个文件是用日期进行命名的csv文件,选择其中一份查看


image.png
import pandas as pd
path = './us_report/'
file_name = '04-12-2020.csv'
df = pd.read_csv(path + file_name)
df.head()
image.png

第二步:需求分析
现在需要做两件事:
1) 将每份csv文件中的New York州的'Confirmed','Deaths','Recovered','Active'数据提取出来
2)将提取出来的数据合并成一个大的DataFrame, 并且以文件名中的日期作为Index

第三步:解决思路

  1. 从每份文档中提取信息是一个重复的操作,适合使用一个函数来完成
  2. 这个函数干两件事:提取文件名中的日期和New York州的数据。这个都很简单:
state = 'New York'
need_col = ['Confirmed','Deaths','Recovered','Active']

def file_process(f):
    f_index = [f.split('.')[0]] # 注意index必须要是一个列表的形式
    f_path = path + f
    f_df = pd.read_csv(f_path)
    new_df = f_df[f_df['Province_State'] == state][need_col]
    new_df.index = f_index
    
    return new_df

# 使用一个文件调试,看看是否能够正确的提取信息
file_process('05-01-2020.csv')
image.png

OK,程序可以跑

  1. 遍历整个文件夹,对每份文件调用相同的函数之后在合并信息,搞定!
# 读取所有样本
df1 = file_process('04-12-2020.csv')
for file in os.listdir(path)[1:]:
    df1 = pd.concat([df1, file_process(file)])
df1

结果如下:


image.png

在这里,使用函数的好处是如果需求有变,例如将New York换成其他州,或者需要其他信息的时候,只要在函数外面定义相应的值即可。由于函数的主体和其他部分是解耦的,当有需求改动的时候,只需要做较小的改动即可完成!

参考:开源内容Joyful Pandas, 作者 DataWhale耿远昊
另外,更多精彩内容也可以微信搜索,并关注公众号:‘Python数据科学家之路“ ,期待您的到来和我交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容