pandas數(shù)據(jù)合并:concat、join、append

公眾號(hào):尤而小屋
作者:Peter
編輯:Peter

大家好,我是Peter~

圖解pandas數(shù)據(jù)合并:concat+join+append

在上一篇文章中介紹過(guò)pandas中最為常用的一個(gè)合并函數(shù)merge的使用,本文中介紹的是另外3個(gè)與合并操作相關(guān)的函數(shù):

  • concat
  • join
  • append
image

Pandas連載

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

image

模擬數(shù)據(jù)

首先是模擬幾份不同的數(shù)據(jù):

import pandas as pd
import numpy as np
image
image
image
image
image

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)行合并

image

axis

指定合并的方向

image
image

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

image
  • 根據(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)增加自然索引。

image

參數(shù)join

指定取得交集inner還是并集outer,默認(rèn)是并集outer

image

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

image

參數(shù)keys

image

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

image

參數(shù)name

指定每個(gè)層級(jí)索引的名字

image

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

image

合并多個(gè)DataFrame

同時(shí)合并df1、df2、df5

pd.concat([pd.concat([df1,df2],axis=0,ignore_index=True),df5],axis=1)
image

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

image

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ù):

image
image
image

參數(shù) lsuffix、rsuffix

功能是為了添加指定的后綴

image

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

image

參數(shù)how

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

image

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

image

可以在默認(rèn)的參數(shù)結(jié)果中,name字段被分成了name_left和name_right,如何進(jìn)行字段的合并呢???

  1. 先把鍵當(dāng)做行索引
  2. 通過(guò)join合并
  3. 通過(guò)reset_index()重新設(shè)置索引
image

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

image

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

image

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

image

合并多個(gè)DataFrame

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

image

如果我們想要用merge函數(shù)來(lái)實(shí)現(xiàn)呢?

使用how="outer",保留全部字段的數(shù)據(jù)信息

image

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ù)

image

添加不同類(lèi)型數(shù)據(jù)

1、Python字典

image

2、Series類(lèi)型

image

3、最常用的DataFrame

image

默認(rèn)合并

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

image

參數(shù)ignore_index

改變生成的索引值

image

參數(shù)verify_integrity

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

image
image

案例實(shí)戰(zhàn)

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

1、訂單表

image

2、訂單商品表

image

3、商品信息表

image

現(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
image
#  讀取訂單商品表
df2 = pd.read_excel("水果訂單商品信息3個(gè)表.xlsx",sheet_name=1)

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

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

image

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

image

當(dāng)我們得到上面的結(jié)果后,就可以完成很多的需求,舉2個(gè)例子說(shuō)明:

1、不同水果的銷(xiāo)量和訂單數(shù):根據(jù)水果進(jìn)行分組統(tǒng)計(jì)數(shù)量和訂單數(shù)

image

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

image

總結(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ì)讀者有所幫助。

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

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

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