Pandas處理大資料的一些小技巧

2021-09-23 07:29:17 字數 2041 閱讀 1415

大文字資料的讀寫

有時候我們會拿到一些很大的文字檔案,完整讀入記憶體,讀入的過程會很慢,甚至可能無法讀入記憶體,或者可以讀入記憶體,但是沒法進行進一步的計算,這個時候如果我們不是要進行很複雜的運算,可以使用read_csv提供的chunksize或者iterator引數,來部分讀入檔案,處理完之後再通過to_csv的mode='a',將每部分結果逐步寫入檔案。

to_csv, to_excel的選擇

在輸出結果時統稱會遇到輸出格式的選擇,平時大家用的最多的.csv, .xls, .xlsx,後兩者乙個是excel2003,乙個是excel2007,我的經驗是csv>xls>xlsx,大檔案輸出csv比輸出excel要快的多,xls只支援60000+條記錄,xlsx雖然支援記錄變多了,但是,如果內容有中文常常會出現詭異的內容丟失。因此,如果數量較小可以選擇xls,而數量較大則建議輸出到csv,xlsx還是有數量限制,而且大資料量的話,會讓你覺得python都死掉了

讀入時處理日期列

我之前都是在資料讀入後通過to_datetime函式再去處理日期列,如果資料量較大這又是乙個浪費時間的過程,其實在讀入資料時,可以通過parse_dates引數來直接指定解析為日期的列。它有幾種引數,true的時候會將index解析為日期格式,將列名作為list傳入則將每乙個列都解析為日期格式

關於to_datetime函式再多說幾句,我們拿到的時期格式常常出現一些亂七八糟的怪資料,遇到這些資料to_datimetime函式缺省會報錯,其實,這些資料是可以忽略的,只需要在函式中將errors引數設定為'ignore'就可以了。

把一些數值編碼轉化為文字

前面提到了map方法,我就又想到了乙個小技巧,我們拿到的一些資料往往是通過數字編碼的,比如我們有gender這一列,其中0代表男,1代表女。當然我們可以用索引的方式來完成

其實我們有更簡單的方法,對要修改的列傳入乙個dict,就會達到同樣的效果。

通過shift函式求使用者的相鄰兩次登入記錄的時間差

之前有個專案需要計算使用者相鄰兩次登入記錄的時間差,咋看起來其實這個需求很簡單,但是資料量大起來的話,就不是乙個簡單的任務,拆解開來做的話,需要兩個步驟,第一步將登入資料按照使用者分組,再計算每個使用者兩次登入之間的時間間隔。資料的格式很單純,如下所示

如果資料量不大的,可以先unique uid,再每次計算乙個使用者的兩次登入間隔,類似這樣

這種方法雖然計算邏輯比較清晰易懂,但是缺點也非常明顯,計算量巨大,相當與有多少量記錄就要計算多少次。

那麼為什麼說pandas的shift函式適合這個計算呢?來看一下shift函式的作用

剛好把值向下錯位了一位,是不是恰好是我們需要的。讓我們用shift函式來改造一下上面的**。

上面的**就把pandas向量化計算的優勢發揮出來了,規避掉了計算過程中最耗費時間的按uid迴圈。如果我們的uid都是乙個只要排序後用shift(1)就可以取到所有前一次登入的時間,不過真實的登入資料中有很多的不用的uid,因此再將uid也shift一下命名為uid0,保留uid和uid0匹配的記錄就可以了。

Pandas處理「大」資料的一些技巧

實習定下來下的空檔期,抽空參加了一些大資料競賽,pandas用的比較多,所以這裡彙總下pandas的一些使用心得和總結一些遇到過的問題吧。import pandas as pd res for dfs in pd.read csv data.csv chunksize 1000 iterator t...

Pandas時間處理的一些小方法

1.timestamp 的構造方法 import pandas as pd from datetime import datetime as dt p1 pd.timestamp 2017,6,19 p2 pd.timestamp dt 2017,6,19,hour 9,minute 13,seco...

pandas 大資料處理

準備 檢視所佔記憶體函式 def mem usage pandas obj if isinstance pandas obj,pd.dataframe usage b pandas obj.memory usage deep true sum else usage b pandas obj.memo...