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'] )