數據城堡參賽代碼實戰篇(二)---使用pandas進行數據去重

小編們最近參加了數據城堡舉辦的「大學生助學金精準資助預測」比賽,分組第19名的成績進入了複賽,很激動有木有!在上一篇文章中(數據城堡參賽代碼實戰篇(一)---手把手教你使用pandas),小編帶你使用pandas並結合官方給出的一卡通消費數據一步步計算得到了每個同學的恩格爾係數,主要介紹了groupby()pivot_table()兩個方法。雖然有些地方寫的不成熟,但是仍然收穫了很多的肯定和鼓勵,這也是小編再接再厲繼續完成本系列的動力,謝謝大家!本篇,小編文文將帶你探討pandas在數據去重中的應用。

1 上期回顧

1.1 groupby

groupby用於對pandas數據進行分組,使用示例如下:

card_group=card_df.groupby([id,how])[amount].sum()n

首先我們根據id和how兩列對數據進行分組,並對分組結果中的amount列進行求和運算,返回最後的結果。

1.2 pivot_table

pivot_table是pandas提供的透視表函數,它根據一個或多個鍵對數據進行聚合,並根據行列上的分組鍵將數據分配到各個矩形區域中。使用示例如下:

card_df.pivot_table(amount,index=[id],columns=[how],aggfunc=sum)n

這裡,我們指定行索引為id列,列索引為how列,並返回amount列按照aggfunc參數指定的聚合方法的聚合結果值,這樣描述起來可能有些拗口,舉個簡單的例子,比如原使數據是下面這個樣子:

id how amountn01 食堂 200n01 淋浴 10n01 食堂 20n02 食堂 300n02 淋浴 50n02 淋浴 30n02 食堂 150n

則按照上面的方式生成的透視表如下所示:

食堂 淋浴n01 220 10n02 450 80n

2 圖書數據處理

這裡,小編將介紹官方給出的圖書館數據的處理過程,首先回顧一下圖書館數據樣例:

圖書館的開放時間為早上7點到晚上22點,門禁編號數據在2014/02/23之前只有「編號」信息,之後引入了「進門、出門」信息,還有些異常信息為null,請參賽者自行處理。

欄位描述和示例如下:

學生id,門禁編號,具體時間

3684,"5","2013/09/01 08:42:50"

7434,"5","2013/09/01 08:50:08"

8000,"進門2","2014/03/31 18:20:31"

5332,"小門","2014/04/03 20:11:06"

7397,"出門4","2014/09/04 16:50:51"

根據官方給出的數據,我們想要得到每位同學去過圖書館的天數統計信息,結果如下:

id times n0 13 n1 1 n10 3 n19 10 n20 13 n21 3 n22 9 n23 7 n28 32 n29 38n

下面開始介紹小編的數據處理過程,首先是從讀入數據,很簡單,使用read_csv的方法讀入數據並指定其columns列表:

library_df=pd.read_csv(library_train.txt,header=None)nlibrary_df.columns=[id,gate,time_stamp]nprint (library_df.head(10))n

讀入的數據示例如下:

id gate time_stampn0 3684 5 2013/09/01 08:42:50n1 14314 6 2013/09/01 08:42:59n2 5108 9 2013/09/01 08:43:32n3 5826 7 2013/09/01 08:44:06n4 7730 5 2013/09/01 08:44:25n5 6668 7 2013/09/01 08:47:24n6 11636 8 2013/09/01 08:48:24n7 4036 6 2013/09/01 08:49:53n8 4050 5 2013/09/01 08:50:01n9 7434 5 2013/09/01 08:50:08n

我們可以注意到,time_stamp列記錄的是每次進或出圖書館的具體時間,精確到了秒,那麼如果想要得到在該段時間內每位同學去圖書館的天數統計,下面的兩條數據其實只能算作一天:

id gate time_stampn14878 0 7 2013/10/15 14:55:48n14925 0 7 2013/10/15 18:04:36n

這時候很自然的想到對數據進行去重,但是上面兩條數據的time_stamp是不一樣的呀,無法進行去重,但我們注意到二者在精確到天時數據是一樣的,因此我們只需要截取其中的年月日信息,二者就會變成兩條重複數據。我們使用pandas的str提供的方法,對字元串進行截取,代碼如下:

library_df[time_stamp]=library_df[time_stamp].str[:10]n

在pandas中操作字元串是必須使用.str,其它用法舉例如下:

data.str.split(;)ndata.str.replace(a,b)n

關於pandas中字元串的操作不是本文的重點,此處不再贅述。

經過對字元串的截取操作,我們得到了如下的數據:

id gate time_stampn14878 0 7 2013/10/15n14925 0 7 2013/10/15n

接下來我們就可以進行數據去重了,使用pandas中的drop_duplicates()方法,示例如下:

library_df.drop_duplicates([id,time_stamp],keep=last,inplace=True)n

可以看到我們指定了三個參數,第一個參數是根據哪幾列進行去重的列表,這裡我們指定了id和time_stamp兩列,如果兩條數據的這兩列值相同,則會被當成重複列對待。第二個參數是keep參數,pandas默認在去重時是去掉所有重複數據,使用keep參數可以讓我們保留重複數據中的一條而刪掉其他的數據,keep=last表明保留重複數據中的最後一條,當然你也可以使用keep=first來保留第一條數據。最後一個參數時inplace參數,我們直接替換library_df的數據,而無需賦值給另一個新的DataFrame。

我們來看看此時id為0的同學的所有記錄,代碼如下:

print (library_df[library_df[id]==0])n

輸出結果如下:

id gate time_stamp n14925 0 7 2013/10/15 n15790 0 7 2013/10/17 n17394 0 6 2013/10/21 n17838 0 8 2013/10/22 n20000 0 6 2013/10/27 n23869 0 4 2013/11/04 n24550 0 5 2013/11/05 n33365 0 7 2013/11/20 n44954 0 5 2013/12/10 n49583 0 7 2013/12/17 n70052 0 5 2014/01/03 n79702 0 6 2014/01/09 n161664 0 進門1 2014/03/25 n

可以看到,結果中已經不存在id和time_stamp均相同的數據了。

接下來的工作就簡單了,按照上一節提到的groupby方法,按照id列進行分組聚合就可以了,代碼如下:

library_count_df=library_df.groupby([id])[time_stamp].count()n

這裡,我們按照id列進行分組,並對返回結果中的time_stamp列進行計數處理,最終結果如下:

idn0 13n1 1n10 3n19 10n20 13n21 3n22 9n23 7n28 32n29 38n

最後,使用to_csv方法寫入到文件中即可。

library_count_df.to_csv(library.csv,encoding=gbk)n

3 總結

本文,小編主要介紹了對官方給出的圖書館數據的處理過程,圖書館借閱數據的處理過程類似,同樣得到每位同學的借書數量。這裡主要運用了groupby()對數據進行分組,以及運用drop_duplicates()去除重複數據。現在,所有的數據都已經初步處理完畢,接下來需要對數據進行歸總。那麼,下一篇,小編將帶你探索利用pandas合併數據的奧秘,敬請期待!

作者:文文

公眾號:小小挖掘機

出處:數據城堡參賽代碼實戰篇(二)---使用pandas進行數據去重

最近很多人私信問我問題,平常知乎評論看到不多,如果沒有及時回復,大家也可以加小編微信:tszhihu,進知乎大數據分析挖掘交流群,可以跟各位老師互相交流。謝謝。


推薦閱讀:

Python爬蟲聯想詞視頻和代碼
VisPy 中文文檔:APP模塊
Flowpython針對lambda的一個修正
python封裝阿里雲API

TAG:Python | 数据分析 |