5.3老板交給我一個任務,簡單處理一些數(shù)據(jù),三個CSV文件,每個都是2.3G大小,以下是要求 看著覺得很easy,興沖沖地去搞了,當時還是用的notepad 寫python代碼,對于python來說,表里面的要求利用分片,替換等都可以完成,只剩下最后的濾重比較麻煩,想來想去,用了最笨的方法,遍歷,還是兩重的,時間復雜度瞬間飆到了n平方,代碼跑了一晚上,還沒跑出結果,于是放棄這個蠢辦法,查了查數(shù)據(jù)清洗常用工具,發(fā)現(xiàn)有excel,于是嘗試用excel解決問題,先根據(jù)需要濾重的三個屬性進行排序,之后根據(jù)三個屬性上下相鄰的兩個兩行是否相同添加了新的一列,有重復則賦值TRUE,沒有則賦值FALSE,保存之后,再利用python讀取處理,凡是TRUE的直接略過,只處理FALSE的,自以為很聰明的解決了問題,結果發(fā)給老板,后來想起來打開excel的時候提示我“可能會損失部分數(shù)據(jù)”,而且查到了excel現(xiàn)在只能顯示1048567條數(shù)據(jù),所以想看看到底丟了多少條,用python讀取之后,發(fā)現(xiàn)原文件有近兩千萬條數(shù)據(jù),而我只處理了104萬條,周末就上網(wǎng)查了很多資料,python的pandas庫適合用來做數(shù)據(jù)處理,用import導入pandas庫失敗之后,下載安裝了Anaconda,搭好環(huán)境之后(詳情請見:https://www.zhihu.com/question/58033789) 按照正常思路,肯定是先去重再處理(去重可以去掉一半多數(shù)據(jù)),我將去重分成兩步,先將所有屬性全相同的去重之后再按照指定屬性去重,然后按照要求對每一行數(shù)據(jù)進行處理,最后寫出,后來看了pandas庫的用法,里面的DataFrame有列名,而我的原始數(shù)據(jù)沒有列名,所以我先將原始文件利用python的讀取CSV文件讀出來,判斷是否是“臟”數(shù)據(jù)之后,存入一個list里(rows=[]),寫入目標文件時,先將列名寫入,然后將list寫入,后來發(fā)現(xiàn)每次運行這個程序,電腦就卡死,清理了半天電腦之后發(fā)現(xiàn)還是如此,后來意識到可能是因為數(shù)據(jù)量太大,rows占了太多內存導致電腦卡死,所以想到了辦法:先打開目標文件,寫入列名,再打開原始文件,按行讀取,按照條件判斷這一行是否為“臟”數(shù)據(jù),不是的話再按照上面表格里的要求進行處理,之后按行寫入目標文件,這樣一來,電腦內存占用率下降,電腦也就不會卡了,最后再將初步處理過的文件利用pandas打開,利用其中的DataFrame數(shù)據(jù)結構的方法進行去重,兩千萬條的數(shù)據(jù)五分鐘之內處理完成,以下為源代碼:
為了查看去重效果,加了幾個輸出 在這挖一個坑,其實還是應該先去重再處理會更省時間,但是目前還沒有想到更好的辦法,以后想到了再來更新,還是要再看看pandas庫,實在太強大,不得不服 下面貼一部分原始數(shù)據(jù): F0:AC:D7:73:11:EC,d93004d3-2164-44a0-b4fc-f5adfcf56207,portal,3C:A3:48:45:EA:5E,F0:AC:D7:73:11:EC,City-WiFi,1524813532,20180427 F0:AC:D7:73:11:EC,d93004d3-2164-44a0-b4fc-f5adfcf56207,portal,3C:A3:48:45:EA:5E,F0:AC:D7:73:11:EC,City-WiFi,1524813532,20180427F0:AC:D7:73:11:EC,d93004d3-2164-44a0-b4fc-f5adfcf56207,portal,3C:A3:48:45:EA:5E,F0:AC:D7:73:11:EC,City-WiFi,1524813532,20180427 F0:AC:D7:73:11:EC,d93004d3-2164-44a0-b4fc-f5adfcf56207,portal,3C:A3:48:45:EA:5E,F0:AC:D7:73:11:EC,City-WiFi,1524813532,20180427 F0:AC:D7:73:11:EC,d93004d3-2164-44a0-b4fc-f5adfcf56207,portal,3C:A3:48:45:EA:5E,F0:AC:D7:73:11:EC,City-WiFi,1524813532,20180427 這是處理后的部分數(shù)據(jù): ,Dev_mac,Action,User_mac,User_mac_head,Bssid,WiFi,Time,Date |
|
來自: advanced00 > 《待分類》