公眾號(hào):尤而小屋
作者:Peter
編輯:Peter
大家好,我是Peter~
圖解pandas數(shù)據(jù)合并:concat+join+append
在上一篇文章中介紹過(guò)pandas中最為常用的一個(gè)合并函數(shù)merge的使用,本文中介紹的是另外3個(gè)與合并操作相關(guān)的函數(shù):
- concat
- join
- append

Pandas連載
本文是Pandas數(shù)據(jù)分析庫(kù)的第15篇,歡迎閱讀:

模擬數(shù)據(jù)
首先是模擬幾份不同的數(shù)據(jù):
import pandas as pd
import numpy as np





concat
concat也是一個(gè)常用的合并函數(shù),下面通過(guò)具體例子來(lái)介紹它的使用。
參數(shù)
pandas.concat(objs, # 合并對(duì)象
axis=0, # 合并方向,默認(rèn)是0縱軸方向
join='outer', # 合并取的是交集inner還是并集outer
ignore_index=False, # 合并之后索引是否重新
keys=None, # 在行索引的方向上帶上原來(lái)數(shù)據(jù)的名字;主要是用于層次化索引,可以是任意的列表或者數(shù)組、元組數(shù)據(jù)或者列表數(shù)組
levels=None, # 指定用作層次化索引各級(jí)別上的索引,如果是設(shè)置了keys
names=None, # 行索引的名字,列表形式
verify_integrity=False, # 檢查行索引是否重復(fù);有則報(bào)錯(cuò)
sort=False, # 對(duì)非連接的軸進(jìn)行排序
copy=True # 是否進(jìn)行深拷貝
)
默認(rèn)情況
默認(rèn)情況是直接在縱向上進(jìn)行合并

axis
指定合并的方向


如果某個(gè)數(shù)據(jù)框中不存在,則會(huì)顯示為NaN:

- 根據(jù)實(shí)際數(shù)據(jù)調(diào)整合并的方向,默認(rèn)是axis=0
- 某個(gè)數(shù)據(jù)庫(kù)中不存在的數(shù)據(jù),用NaN代替
參數(shù)ignore_index
是否保留原表索引,默認(rèn)保留,為 True 會(huì)自動(dòng)增加自然索引。

參數(shù)join
指定取得交集inner還是并集outer,默認(rèn)是并集outer

df3和df4只有地址這個(gè)字段是相同的,所以保留了它,其他的舍棄了:

參數(shù)keys

當(dāng)我們?cè)O(shè)置了索引重排(ignore_index=True),keys參數(shù)就無(wú)效啦

參數(shù)name
指定每個(gè)層級(jí)索引的名字

我們可以檢查下df6的索引,發(fā)現(xiàn)是層級(jí)索引:

合并多個(gè)DataFrame
同時(shí)合并df1、df2、df5
pd.concat([pd.concat([df1,df2],axis=0,ignore_index=True),df5],axis=1)

分兩步來(lái)實(shí)現(xiàn):先合并df1、df2,將得到的結(jié)果和df5合并

join
參數(shù)
來(lái)自官網(wǎng)的參數(shù)說(shuō)明:
dataframe.join(other, # 待合并的另一個(gè)數(shù)據(jù)框
on=None, # 連接的鍵
how='left', # 連接方式:‘left’, ‘right’, ‘outer’, ‘inner’ 默認(rèn)是left
lsuffix='', # 左邊(第一個(gè))數(shù)據(jù)框相同鍵的后綴
rsuffix='', # 第二個(gè)數(shù)據(jù)框的鍵的后綴
sort=False) # 是否根據(jù)連接的鍵進(jìn)行排序;默認(rèn)False
模擬數(shù)據(jù)
為了解釋join的操作,再模擬下數(shù)據(jù):



參數(shù) lsuffix、rsuffix
功能是為了添加指定的后綴

如果不指定的話,會(huì)報(bào)錯(cuò):

參數(shù)how
how參數(shù)默認(rèn)是left,保留左邊的全部字段。右邊不存在的數(shù)據(jù)用NaN

改成right之后,保留右邊的全部數(shù)據(jù):

可以在默認(rèn)的參數(shù)結(jié)果中,name字段被分成了name_left和name_right,如何進(jìn)行字段的合并呢???
- 先把鍵當(dāng)做行索引
- 通過(guò)join合并
- 通過(guò)reset_index()重新設(shè)置索引

合并兩個(gè)數(shù)據(jù):

最后進(jìn)行索引重置的功能:

還有一種更為簡(jiǎn)便的方法:

合并多個(gè)DataFrame
利用join來(lái)實(shí)現(xiàn)多個(gè)DataFrame的合并:

如果我們想要用merge函數(shù)來(lái)實(shí)現(xiàn)呢?
使用how="outer",保留全部字段的數(shù)據(jù)信息

append
字面意思是“追加”。向dataframe對(duì)象中添加新的行,如果添加的列名不在dataframe對(duì)象中,將會(huì)被當(dāng)作新的列進(jìn)行添加
參數(shù)
DataFrame.append(other,
ignore_index=False,
verify_integrity=False,
sort=False)
參數(shù)解釋?zhuān)?/p>
- other:待合并的數(shù)據(jù)??梢允莗andas中的DataFrame、series,或者是Python中的字典、列表這樣的數(shù)據(jù)結(jié)構(gòu)
- ignore_index:是否忽略原來(lái)的索引,生成新的自然數(shù)索引
- verify_integrity:默認(rèn)是False,如果值為T(mén)rue,創(chuàng)建相同的index則會(huì)拋出異常的錯(cuò)誤
- sort:boolean,默認(rèn)是None。如果self和other的列沒(méi)有對(duì)齊,則對(duì)列進(jìn)行排序,并且屬性只在版本0.23.0中出現(xiàn)。
模擬數(shù)據(jù)

添加不同類(lèi)型數(shù)據(jù)
1、Python字典

2、Series類(lèi)型

3、最常用的DataFrame

默認(rèn)合并
df12和df13默認(rèn)合并的結(jié)果:

參數(shù)ignore_index
改變生成的索引值

參數(shù)verify_integrity
默認(rèn)是False,如果值為T(mén)rue,創(chuàng)建相同的index則會(huì)拋出異常的錯(cuò)誤


案例實(shí)戰(zhàn)
假設(shè)現(xiàn)在一個(gè)excel表中有3個(gè)sheet:訂單表、訂單商品表、商品信息表:
1、訂單表

2、訂單商品表

3、商品信息表

現(xiàn)在我們通過(guò)合并函數(shù)將3個(gè)sheet中的內(nèi)容關(guān)聯(lián)起來(lái):
import pandas as pd
import numpy as np
# 讀取訂單表中的內(nèi)容
df1 = pd.read_excel("水果訂單商品信息3個(gè)表.xlsx",sheet_name=0) # 第一個(gè)sheet的內(nèi)容,索引從0開(kāi)始
df1

# 讀取訂單商品表
df2 = pd.read_excel("水果訂單商品信息3個(gè)表.xlsx",sheet_name=1)
# 商品信息表
df3 = pd.read_excel("水果訂單商品信息3個(gè)表.xlsx",sheet_name="商品信息") # 可以直接指定sheet的名字name,不通過(guò)索引
df3

第一步:訂單表和訂單商品表的合并

第二步:將上面的結(jié)果和商品信息表合并

當(dāng)我們得到上面的結(jié)果后,就可以完成很多的需求,舉2個(gè)例子說(shuō)明:
1、不同水果的銷(xiāo)量和訂單數(shù):根據(jù)水果進(jìn)行分組統(tǒng)計(jì)數(shù)量和訂單數(shù)

2、不同區(qū)域的水果銷(xiāo)售額和客戶數(shù)

總結(jié)
兩篇關(guān)于pandas數(shù)據(jù)合并的文章,詳細(xì)介紹了4個(gè)函數(shù):merge、concat、join、append的使用;其中,merge和concat最為常用。它們可以是實(shí)現(xiàn)SQL中join的功能。不管是交集、并集、還是左右連接,甚至是全連接都是可以直接實(shí)現(xiàn)的。
上面的實(shí)戰(zhàn)案例數(shù)據(jù)是存放在一個(gè)Excel表中。在pandas中,我們可以從不同的來(lái)源:Excel、數(shù)據(jù)庫(kù)、本地文件夾等獲取來(lái)進(jìn)行數(shù)據(jù)合并,方便后續(xù)實(shí)現(xiàn)我們的需求,希望本文對(duì)讀者有所幫助。