午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

利用python處理兩千萬條數(shù)據(jù)的一些經(jīng)驗(僅供自己記錄)

 advanced00 2018-10-06

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ù)五分鐘之內處理完成,以下為源代碼:

  1. import csv
  2. rows=[]
  3. with open(r'C:\Users\Hanju\Desktop\uploadPortal(5).csv','w', newline='') as _csvfile:
  4. writer = csv.writer(_csvfile)
  5. #先寫入columns_name
  6. writer.writerow(['Dev_mac','Action','User_mac','User_mac_head','Bssid','WiFi','Time','Date'])
  7. i=0
  8. with open(r'D:\UploadPortalData\uploadPortal (5).csv',encoding='UTF-8') as csvfile:
  9. readCSV=csv.reader(csvfile,delimiter=',')
  10. for row in readCSV:
  11. if(len(row)!=8):
  12. continue
  13. row1=[]
  14. i =1
  15. row1.append(row[0].replace(':','')[-5:])
  16. if row[2]=='auth':
  17. row1.append('1')
  18. elif row[2]=='deauth':
  19. row1.append('2')
  20. elif row[2]=='portal':
  21. row1.append('3')
  22. elif row[2]=='portalauth':
  23. row1.append('4')
  24. row1.append(str(row[3].replace(':','')))
  25. row1.append(str(row[3].replace(':','')[0:6]))
  26. if row[0]==row[4]:
  27. row1.append('2')
  28. else:
  29. row1.append('5')
  30. if 'City-WiFi-5G' in row[5]:
  31. row1.append('2')
  32. elif 'City-WiFi' in row[5]:
  33. row1.append('1')
  34. else:
  35. row1.append('0')
  36. row1.append(float(row[6])/86400.0-2.0/3.0 719530.0)
  37. row1.append(row[7])
  38. writer.writerow(row1)
  39. print('Done')
  40. print(i)
  41. import pandas as pd
  42. df=pd.read_csv(r'C:\Users\Hanju\Desktop\uploadPortal(5).csv')
  43. #print(df.head())
  44. #print(df.tail())
  45. print(df.shape)
  46. New_df=df.drop_duplicates(['Action','User_mac','Time'])
  47. print(New_df.shape)
  48. #print(New_df.head())
  49. #print(New_df.tail())
  50. New_df.to_csv(r'C:\Users\Hanju\Desktop\uploadPortal(5)_Final.csv')
  51. print('Done')

為了查看去重效果,加了幾個輸出

在這挖一個坑,其實還是應該先去重再處理會更省時間,但是目前還沒有想到更好的辦法,以后想到了再來更新,還是要再看看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,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
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
0,311EC,3,3CA34845EA5E,3CA348,2,1,737177.6381018519,20180427
17,311EC,1,F42981BEF089,F42981,2,1,737177.6349074075,20180427
18,311EC,2,F42981BEF089,F42981,2,1,737177.6349074075,20180427
19,311EC,1,F42981BEF089,F42981,2,1,737177.6349189816,20180427
20,311EC,1,3CA34845EA5E,3CA348,2,1,737177.6349421295,20180427

就用這個不算完善的結果來作為我CSDN博客的處女作吧,畢竟,終于動手寫了一篇,雖然都是流水賬,可能對別人沒有多大參考價值,以后的博客多寫一些遇到的坑及解決辦法吧,做些記錄的同時也有可能對別人有所幫助,畢竟我自己遇到的好多問題都是參考了很多博主的文章得以解決的,就到這里吧!

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多