pandas數據合併:concat、join、append

公衆號:尤而小屋
作者:Peter
編輯:Peter

大家好,我是Peter~

圖解pandas數據合併:concat+join+append

在上一篇文章中介紹過pandas中最爲常用的一個合併函數merge的使用,本文中介紹的是另外3個與合併操作相關的函數:

  • concat
  • join
  • append

Pandas連載

本文是Pandas數據分析庫的第15篇,歡迎閱讀:

模擬數據

首先是模擬幾份不同的數據:

import pandas as pd
import numpy as np

concat

concat也是一個常用的合併函數,下面通過具體例子來介紹它的使用。

參數

pandas.concat(objs,  # 合併對象
              axis=0,   # 合併方向,默認是0縱軸方向
              join='outer', # 合併取的是交集inner還是並集outer
              ignore_index=False, # 合併之後索引是否重新
              keys=None, # 在行索引的方向上帶上原來數據的名字;主要是用於層次化索引,可以是任意的列表或者數組、元組數據或者列表數組
              levels=None, # 指定用作層次化索引各級別上的索引,如果是設置了keys
              names=None, # 行索引的名字,列表形式
              verify_integrity=False, # 檢查行索引是否重複;有則報錯
              sort=False, # 對非連接的軸進行排序
              copy=True   # 是否進行深拷貝
             )

默認情況

默認情況是直接在縱向上進行合併

axis

指定合併的方向

如果某個數據框中不存在,則會顯示爲NaN:

  • 根據實際數據調整合並的方向,默認是axis=0
  • 某個數據庫中不存在的數據,用NaN代替

參數ignore_index

是否保留原表索引,默認保留,爲 True 會自動增加自然索引。

參數join

指定取得交集inner還是並集outer,默認是並集outer

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

參數keys

當我們設置了索引重排(ignore_index=True),keys參數就無效啦

參數name

指定每個層級索引的名字

我們可以檢查下df6的索引,發現是層級索引:

合併多個DataFrame

同時合併df1、df2、df5

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

分兩步來實現:先合併df1、df2,將得到的結果和df5合併

join

參數

來自官網的參數說明:

dataframe.join(other,  # 待合併的另一個數據框
        on=None,  # 連接的鍵
        how='left',   # 連接方式:‘left’, ‘right’, ‘outer’, ‘inner’ 默認是left
        lsuffix='',  # 左邊(第一個)數據框相同鍵的後綴
        rsuffix='',  # 第二個數據框的鍵的後綴
        sort=False)  # 是否根據連接的鍵進行排序;默認False

模擬數據

爲了解釋join的操作,再模擬下數據:

參數 lsuffix、rsuffix

功能是爲了添加指定的後綴

如果不指定的話,會報錯:

參數how

how參數默認是left,保留左邊的全部字段。右邊不存在的數據用NaN

改成right之後,保留右邊的全部數據:

可以在默認的參數結果中,name字段被分成了name_left和name_right,如何進行字段的合併呢???

  1. 先把鍵當做行索引
  2. 通過join合併
  3. 通過reset_index()重新設置索引

合併兩個數據:

最後進行索引重置的功能:

還有一種更爲簡便的方法:

合併多個DataFrame

利用join來實現多個DataFrame的合併:

如果我們想要用merge函數來實現呢?

使用how="outer",保留全部字段的數據信息

append

字面意思是“追加”。向dataframe對象中添加新的行,如果添加的列名不在dataframe對象中,將會被當作新的列進行添加

參數

DataFrame.append(other, 
                 ignore_index=False, 
                 verify_integrity=False, 
                 sort=False)

參數解釋:

  • other:待合併的數據。可以是pandas中的DataFrame、series,或者是Python中的字典、列表這樣的數據結構
  • ignore_index:是否忽略原來的索引,生成新的自然數索引
  • verify_integrity:默認是False,如果值爲True,創建相同的index則會拋出異常的錯誤
  • sort:boolean,默認是None。如果self和other的列沒有對齊,則對列進行排序,並且屬性只在版本0.23.0中出現。

模擬數據

添加不同類型數據

1、Python字典

2、Series類型

3、最常用的DataFrame

默認合併

df12和df13默認合併的結果:

參數ignore_index

改變生成的索引值

參數verify_integrity

默認是False,如果值爲True,創建相同的index則會拋出異常的錯誤

案例實戰

假設現在一個excel表中有3個sheet:訂單表、訂單商品表、商品信息表:

1、訂單表

2、訂單商品表

3、商品信息表

現在我們通過合併函數將3個sheet中的內容關聯起來:

import pandas as pd
import numpy as np

# 讀取訂單表中的內容
df1 = pd.read_excel("水果訂單商品信息3個表.xlsx",sheet_name=0)  # 第一個sheet的內容,索引從0開始
df1
#  讀取訂單商品表
df2 = pd.read_excel("水果訂單商品信息3個表.xlsx",sheet_name=1)

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

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

第二步:將上面的結果和商品信息表合併

當我們得到上面的結果後,就可以完成很多的需求,舉2個例子說明:

1、不同水果的銷量和訂單數:根據水果進行分組統計數量和訂單數

2、不同區域的水果銷售額和客戶數

總結

兩篇關於pandas數據合併的文章,詳細介紹了4個函數:merge、concat、join、append的使用;其中,merge和concat最爲常用。它們可以是實現SQL中join的功能。不管是交集、並集、還是左右連接,甚至是全連接都是可以直接實現的。

上面的實戰案例數據是存放在一個Excel表中。在pandas中,我們可以從不同的來源:Excel、數據庫、本地文件夾等獲取來進行數據合併,方便後續實現我們的需求,希望本文對讀者有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章