寫在前言:
1. 閱讀,并不是為了記住所有的細(xì)節(jié),而是要知曉這個事物的存在,并在合適的時機去使用它;
2. 當(dāng)你跟隨別人使用一個技術(shù)時,往往并不能感受其存在的必要意義,然而,當(dāng)你帶著問題去尋找解決方案時,在找到的那一剎,一定能深深地體會到其存在的合理性和必要性。
在做數(shù)據(jù)分析時,經(jīng)常會遇到這樣的問題:數(shù)據(jù)分布在多個數(shù)據(jù)源,當(dāng)從這些數(shù)據(jù)源查詢數(shù)據(jù)時,每個數(shù)據(jù)源都得到一個list,每個list中有著不同意義的字段數(shù)據(jù),那么如何將多個list的數(shù)據(jù)內(nèi)容合并成一個list來做統(tǒng)計分析?舉個例子,我需要分析不同城市的人對某個page的點擊次數(shù),數(shù)據(jù)分布在MySQL和MongoDB中。
1)MySQL中查詢出來的數(shù)據(jù):
2)MongoDB中查詢出來的數(shù)據(jù):
[{'page_click_count': 20, 'user_id': 1},
{'page_click_count': 38, 'user_id': 2},
{'page_click_count': 10, 'user_id': 3}]
3)現(xiàn)在需要將兩個列表融合起來,得到一個新的列表:
[{'city': 'BeiJing', 'page_click_count': 20, 'user_id': 1},
{'city': 'NanJing', 'page_click_count': 38, 'user_id': 2},
{'city': 'BeiJing', 'page_click_count': 10, 'user_id': 3},
{'city': 'TianJin', 'page_click_count': 0, 'user_id': 4}]
這樣的問題在實際操作中會遇到很多,對應(yīng)單純的MySQL還好,如果是多個數(shù)據(jù)源或者MongoDB(MongoDB不支持JOIN),就會比較棘手了,我們且將這個問題稱為異源數(shù)據(jù)融合問題(這里暫不考慮優(yōu)化數(shù)據(jù)源的問題)。
要解決這個問題,通過程序編寫邏輯來實現(xiàn)肯定是可以做到的,比如對第一個列表生成一個dict,然后循環(huán)第二個列表,如果發(fā)現(xiàn)dict中有user_id就插入對應(yīng)數(shù)據(jù)到第二個列表中。然而,如果需要融合的不止2個,而是超過四五個,這么做就會顯得很丑陋和繁瑣了,此時,你可以選擇自己封裝一個API,或者尋找已有的解決方案。
在遇到這個問題之前,筆者就接觸過一點pandas庫的知識,但是因為沒有很強的業(yè)務(wù)需求就沒有深入使用,但是在大腦中還是保留著一個印象的:pandas是一個強大的數(shù)據(jù)分析工具包,其核心基礎(chǔ)是數(shù)組和矩陣。帶著上面的疑問和對panadas的一點點認(rèn)知,開始google尋找解決方案。而pandas正好提供了這么一個強大的將數(shù)據(jù)規(guī)整化的方法:pandas.merge。
pandas.merge可以根據(jù)一個或多個鍵將不同的DataFrame中的行連接起來,實現(xiàn)了SQL JOIN風(fēng)格的合并方法。以上面的問題為例,
1)構(gòu)建數(shù)據(jù)結(jié)構(gòu)DataFrame(Series與DataFrame是pandas的核心數(shù)據(jù)結(jié)構(gòu)):
2)調(diào)用merge函數(shù),實現(xiàn)數(shù)據(jù)合并:
是不是很簡單?通過調(diào)用pandas.merge方法直接就解決了上述的問題,即使有多個數(shù)據(jù)源數(shù)據(jù),也可以輕松的解決。如果你比較細(xì)心,那么一定會發(fā)現(xiàn)幾個問題:
1)這里,并沒有指定要用哪個列來做JOIN。默認(rèn)的,如果沒有指定,pandas就會將重疊列的列名作為鍵,不過,最好是顯示指定一下:
但是,如果兩個DataFrame對象的列名不同,該如何做呢?pandas也為你想到了,可以分別指定兩個不同名字的列名來做JOIN:
2)原始數(shù)據(jù)中有四個用戶id,而在上面的結(jié)果中,只有id為1,2,3的用戶,那么id=4的那個用戶信息哪里去了?id=4的數(shù)據(jù)消失是因為我們這里沒有指定JOIN的方式,默認(rèn)的,pandas使用的是INNER方式,跟SQL語法一樣,只取能完全匹配的數(shù)據(jù),如果需要保留id=4的用戶信息,則需要使用LEFT的方式,如下:
通過pandas提供的merge方法,我們完美的解決了文章開始時提出的異源數(shù)據(jù)融合的問題,而pandas的強大之處遠(yuǎn)遠(yuǎn)不止于此,有需求就有解決方案,pandas的存在正是為了解決各個數(shù)據(jù)分析人員的痛楚,而我們要做的是合理使用其功能來解決實際問題。
附:關(guān)于pandas.merge的使用參數(shù),可以進一步查看官方文檔。
(全文完,本文地址:http://blog.csdn.net/zwgdft/article/details/53144591)
Bruce,2016/11/15
聯(lián)系客服