Pandas從入門到精通(6)- 連接

1. 課程內(nèi)容

SQL中最常見的操作莫過于將好幾張表連接(JOIN)起來查看某些字段,與之類似,Pandas具有功能全面且性能強(qiáng)大連接操作。而且因?yàn)槲覀兊腄ataFrame中有列-columns和索引-index。在Pandas中的連接操作感覺比SQL中要豐富的多。
本期我們就來串一串這些連接方法,主要有:

  • 關(guān)系型連接
    • 針對列進(jìn)行的merge 方法
    • 針對索引的join方法
  • 方向連接
    • 橫向或者縱向拼接-concat方法
    • 其他append/assign方法
      這些方法大部分的參數(shù)都類似,實(shí)際操作中最常用的是merge和concat
      下面我們將主要精力放在這兩個(gè)函數(shù)上

1.1 merge

merge()函數(shù) 基本語法:
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 - 左側(cè)DataFrame中的列用作鍵,可以是列名或長度等于DataFrame長度的數(shù)組。
  • right_on - 來自右的DataFrame的列作為鍵,可以是列名或長度等于DataFrame長度的數(shù)組。
    left_index - 如果為True,則使用左側(cè)DataFrame中的索引(行標(biāo)簽)作為其連接鍵。 在具有MultiIndex(分層)的DataFrame的情況下,級別的數(shù)量必須與來自右DataFrame的連接鍵的數(shù)量相匹配。
  • right_index - 與右DataFrame的left_index具有相同的用法。
  • sort - 按照字典順序通過連接鍵對結(jié)果DataFrame進(jìn)行排序。默認(rèn)為True,設(shè)置為False時(shí),在很多情況下大大提高性能。
  • how - 它是left, right, outer以及inner之中的一個(gè),默認(rèn)為內(nèi)inner。 含義分別是左連接 left 、右連接 right 、內(nèi)連接 inner 、外連接 outer ,它們的區(qū)別可以用如下示意圖表示:
image.png

使用merge時(shí),如果沒有指定 on = 哪一列,則默認(rèn)以重疊列名當(dāng)做鏈接鍵, 當(dāng)然也可以按照多鍵連接,只需要'on'參數(shù)后傳入多鍵列表即可。

1.2 join索引連接

在上面的Merge中,主要是針對columns進(jìn)行連接,如果在merge中指定on = index, 即按照索引來連接,是否可以呢?答案是可以的。但是這種情況最好直接用join來做。pandas 中利用 join 函數(shù)來處理索引連接,它的參數(shù)選擇要少于 merge ,除了必須的 on 和 how 之外,可以對重復(fù)的列指定左右后綴 lsuffix 和 rsuffix 。其中, on 參數(shù)指索引名,單層索引時(shí)省略參數(shù)表示按照當(dāng)前索引連接。

1.3 方向連接concat

前面介紹了關(guān)系型連接,其中最重要的參數(shù)是 on 和 how ,但有時(shí)候用戶并不關(guān)心以哪一列為鍵來合并,只是希望把兩個(gè)表或者多個(gè)表按照縱向或者橫向拼接,為這種需求, pandas 中提供了 concat 函數(shù)來實(shí)現(xiàn)。
在 concat 中,最常用的有三個(gè)參數(shù),它們是 axis, join, keys ,分別表示拼接方向,連接形式,以及在新表中指示來自于哪一張舊表的名字。這里需要特別注意, join 和 keys 與之前提到的 join 函數(shù)和鍵的概念沒有任何關(guān)系。

在默認(rèn)狀態(tài)下的 axis=0 ,表示縱向拼接多個(gè)表,常常用于多個(gè)樣本的拼接;而 axis=1 表示橫向拼接多個(gè)表,常用于多個(gè)字段或特征的拼接。

1.4 其他連接操作

其他類似的連接操作還有append,combine等,比較簡單,這里不在介紹

2. 作業(yè)練習(xí)題

1:美國疫情數(shù)據(jù)集

現(xiàn)有美國4月12日至11月16日的疫情報(bào)表,請將 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']

解答:
第一步查看原始數(shù)據(jù)。原始數(shù)據(jù)存在一個(gè)文件夾中,每個(gè)文件是用日期進(jìn)行命名的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

第二步:需求分析
現(xiàn)在需要做兩件事:
1) 將每份csv文件中的New York州的'Confirmed','Deaths','Recovered','Active'數(shù)據(jù)提取出來
2)將提取出來的數(shù)據(jù)合并成一個(gè)大的DataFrame, 并且以文件名中的日期作為Index

第三步:解決思路

  1. 從每份文檔中提取信息是一個(gè)重復(fù)的操作,適合使用一個(gè)函數(shù)來完成
  2. 這個(gè)函數(shù)干兩件事:提取文件名中的日期和New York州的數(shù)據(jù)。這個(gè)都很簡單:
state = 'New York'
need_col = ['Confirmed','Deaths','Recovered','Active']

def file_process(f):
    f_index = [f.split('.')[0]] # 注意index必須要是一個(gè)列表的形式
    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

# 使用一個(gè)文件調(diào)試,看看是否能夠正確的提取信息
file_process('05-01-2020.csv')
image.png

OK,程序可以跑

  1. 遍歷整個(gè)文件夾,對每份文件調(diào)用相同的函數(shù)之后在合并信息,搞定!
# 讀取所有樣本
df1 = file_process('04-12-2020.csv')
for file in os.listdir(path)[1:]:
    df1 = pd.concat([df1, file_process(file)])
df1

結(jié)果如下:


image.png

在這里,使用函數(shù)的好處是如果需求有變,例如將New York換成其他州,或者需要其他信息的時(shí)候,只要在函數(shù)外面定義相應(yīng)的值即可。由于函數(shù)的主體和其他部分是解耦的,當(dāng)有需求改動的時(shí)候,只需要做較小的改動即可完成!

參考:開源內(nèi)容Joyful Pandas, 作者 DataWhale耿遠(yuǎn)昊
另外,更多精彩內(nèi)容也可以微信搜索,并關(guān)注公眾號:‘Python數(shù)據(jù)科學(xué)家之路“ ,期待您的到來和我交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、數(shù)據(jù)合并、連接 首先導(dǎo)入模塊, 1、concat:沿著一條軸,將多個(gè)對象堆疊到一起 參數(shù)說明:objs:需要連...
    饕餮Fss閱讀 956評論 0 0
  • 第1章 入門知識 簡述:用于操作行列數(shù)據(jù),方便地實(shí)現(xiàn)各種形式的數(shù)據(jù)分析; Pandas最初主要應(yīng)用于金融數(shù)據(jù)分析工...
    惑也閱讀 1,090評論 0 3
  • Pandas.DataFrame操作表連接有三種方式:merge, join, concat。下面就來說一說這三種...
    CC思SS閱讀 59,171評論 0 11
  • pandas Pandas是線上服務(wù)類型,數(shù)據(jù)分析和數(shù)據(jù)處理(在機(jī)器學(xué)習(xí)中數(shù)據(jù)處理) 數(shù)據(jù)分析三劍客: numpy...
    Galaxy_saturn閱讀 919評論 0 1
  • NumPy、Pandas、Scipy是python的三個(gè)庫,也是數(shù)據(jù)分析的常用庫。其中,numpy學(xué)習(xí)強(qiáng)烈推薦Nu...
    圓圓KK閱讀 1,813評論 0 16

友情鏈接更多精彩內(nèi)容