python 數據合並


1. 數據合並

前言

 

一、橫向合並

1. 基本合並語句

2. 鍵值名不一樣的合並

3. “兩個數據列名字重復了”的合並

 

二、縱向堆疊

 


 

統計師的Python日記【第6天:數據合並】

 

前言

 

根據我的Python學習計划:

 

Numpy → Pandas → 掌握一些數據清洗、規整、合並等功能 → 掌握類似與SQL的聚合等數據管理功能 → 能夠用Python進行統計建模、假設檢驗等分析技能 → 能用Python打印出100元錢 → 能用Python幫我洗衣服、做飯 → 能用Python給我生小猴子......

 

前面我把一些基本內容都掌握了,從Python的安裝到語句結構、從Numpy/Pandas的數據格式到基本的描述性統計,現在終於要進入一個“應用型”的學習——數據的合並。

 

其實,我對數據合並很有感情,當年我在某國家醫學數據庫里實習的時候,就經常用SAS對數據庫進行各種合並,以查看受訪者在不同數據庫中的屬性,可以說是使用率非常高的一個技能。

 

先復習一下幾種數據合並方式:左連接(left join)、右連接(right join)、內連接(inner join)、全連接(full join)。

 

  • 左連接(left join):以左邊的表為基准表,將右邊的數據合並過來。

 

 

  • 右連接(right join):以右邊的表為基准表,將左邊的數據合並過來。

     

 

  • 內連接(inner join):左邊和右邊都出現的數據才進行合並。

     

 

  • 全連接(full join):不管左邊還是右邊,只要出現的數據都合並過來。

     

 

以上的幾種合並,都是按照姓名來合並的,兩個表姓名一樣,即將這條數據合並,這個姓名被稱為鍵值,反正叫什么也無所謂,有一個變量被用來作為合並參照就可以了。

 

OK,今天將學習Python/Pandas的數據合並,合並是基於Pandas這個庫,因此首先我們要導入庫:import pandas as pd

 

准備工作完成,開始學習~

 

 

一、橫向合並

 

1. 基本合並語句

 

我有兩個數據:

 

  • D1 為某洗發店的會員數據,包括會員編號id和會員姓名name。

 

生成語句為:D1 = pd.DataFrame({'id':[801, 802, 803,804, 805, 806, 807, 808, 809, 810], 'name':['Ansel', 'Wang', 'Jessica', 'Sak','Liu', 'John', 'TT','Walter','Andrew','Song']})

 

 

  • D2為該洗發店本月的初值情況,可以看出,本月只有三位會員進行了儲值。

 

 

生成語句為:D2 = pd.DataFrame({'id':[803, 804, 808,901], 'save': [3000, 500, 1200, 8800]})

 

 

現在我想將這兩個表合並起來,即 “id-name-save” 的表,鍵值為id,基本語句為:merge(D1, D2, on='id')

 

 

哎,我記得合並有左連接、右連接等等,這里我什么也沒指定,默認的貌似就是內連接(inner),D1中的801等好幾個、D2中的901都沒有被合並上,只合並了兩個數據中都存在的。

 

好下面我來左連接,基本語句為:merge(D1, D2, on='id', how='left')

 

 

D1都被合並進來了,D2的901則沒有。

 

再來一個右連接,基本語句為:merge(D1, D2, on='id', how='right')

 

 

右邊的所有數據都被合並進來了。

 

全合並的基本語句為:merge(D1, D2, on='id', how='outer')

 

 

2. 鍵值名不一樣的合並

 

剛剛的D1和D2,他們都有一個變量id,假如這個鍵值的名字不一樣怎么辦?一個叫“id1”、一個叫“id2”。

 

 

這種情況只要用 left_on= 和 right_on= 分別指定兩個鍵的名字即可,基本語句為:merge(D1, D2, left_on='id1', right_on='id2')

 

 

我有一個比較變態的問題:如果數據1的鍵值是變量id,數據2的鍵值是一個索引,該怎么合並?像這樣:

 

 

 

也很簡單,使用 left_index=True 或 right_index=True,來聲明某個數據的索引應該被當做鍵值,基本語句為:merge(D1, D2, left_on='id', right_index=True)

 

 

 

3. 兩個數據的列名字重復了

 

如果兩個數據有一樣的變量名,那么合並會報錯嗎?舉個例子,現在有803、804、808、901這四位會員3月的儲值數據,數據名為D3Month。

 

 

 

生成語句為:D3Month= pd.DataFrame({'id':[803, 804, 808, 901], 'save': [3000, 500, 1200, 8800]})

 

以及四月的儲值數據,數據名為D4Month:

 

 

生成語句為:D4Month= pd.DataFrame({'id':[803, 804, 808, 901], 'save': [0, 1500, 1000, 2000]})

 

現在想把兩個表合並起來,但是兩個數據都有save變量,合並之后會報錯嗎?來看一下吧~

 

 

 

沒有報錯,並且兩個save自動打上了后綴,一個是_x,一個是_y,實際上,我們也可以自己加后綴,使用 suffixes=() 選項。比如,我將后綴變為:_3Month和_4Month,基本語句為:merge(D3Month, D4Month, on='id',how='left', suffixes=('_3Month', '_4Month’))

 

 

 

 

二、縱向堆疊

 

第一部分的內容學習的是將兩個數據橫向的合並,現在學習縱向合並——也叫做堆疊。比如,我們想象之前的會員數據,被分成了兩個部分:

 

  • D1:

     

 

 

  • D2:

 

 

 

現在咱們再將這兩個部分縱向的堆疊起來,注意對這類的堆疊問題,我在以后的日記中盡量不用“合並”這個詞(而使用“堆疊”),以便和第一部分的merge區分開來。堆疊的基本語句為:concat([D1,D2])

 

 

 

這種情況我在之前的工作中也經常遇到,而且,常常會有這樣的需求:堆疊起來的數據,能不能給個標志,標出哪部分來自D1,哪部分來自D2?

 

肯定可以,用 keys=[ , ] 來標識出來,基本語句為:concat([D1,D2], keys=['D1', 'D2'] )

 

 

當然我們也可以橫向堆疊,指定 axis=1,注意嘍,雖然是橫向,但不是合並(merge),仍然是堆疊,橫向堆疊就是粗暴的將兩個數據橫向堆在一起,請看:

 

 

仍然可以用 keys=[] 來標識出那邊來自D1、哪邊來自D2,基本語句為:concat([D1,D2], axis=1, keys=['D1', 'D2'] )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM