Pandas提升效率的十個技巧


1、read_csv

 如果你要讀取的數據量很大時,你可以嘗試使用一下這個參數:chunksize=5。在實際加載整個數據表之前,只讀取表的一小部分。

2、select_dtypes

在使用 Python 做數據預處理時,這個命令會幫你節省時間。在讀取表后,每列的默認數據類型可以是 bool、int64、float64、object、category、timedelta64 或者datetime64。你可以先用該命令獲取所有數據類型:

df.dtypes.value_counts()

然后執行以下操作,選擇所需特征的子數據集。

df.select_dtypes(include=[‘float64’, ‘int64’])

3、copy

這是一個非常重要的命令。如果你執行以下命令:

import pandas as pd
df1 = pd.DataFrame({ ‘a’:[0,0,0], ‘b’: [1,1,1]})
df2 = df1
df2[‘a’] = df2[‘a’] + 1
df1.head()

會發現 df1 發生了變化。這是因為 df2 = df1 不是復制 df1 並將其賦值給df2,而是設置一個指向 df1 的指針。所以 df2 的任何變化都會導致 df1的變化。要解決這個問題,可以使用下面的兩種方法:

df2 = df1.copy()   或者

from copy import deepcopy
df2 = deepcopy(df1)

4、map

這是實現簡單數據的轉換中一個很 cool 的方法。首先定義一個字典,其中' keys '是舊值,' values '是新值。

level_map = {1: ‘high’, 2: ‘medium’, 3: ‘low’}
df[‘c_level’] = df[‘c’].map(level_map)

5、apply

如果我們想通過輸入其他一些列值來創建一個新列,那么 apply 函數會非常有用。

def rule(x, y):
    if x == ‘high’ and y > 10:
         return 1
    else:
         return 0
df = pd.DataFrame({ 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]})
df['new'] = df.apply(lambda x: rule(x['c1'], x['c2']), axis =  1)
df.head()

在上面的代碼中,我們定義了一個(x,y)二輸入變量的函數,並使用apply 函數將其應用於“c1”列和“c2”列。

但問題是,apply 方法有時候太慢了。比如,你想計算兩列“c1”和“c2”的最大值,可以這樣做:

df[‘maximum’] = df.apply(lambda x: max(x[‘c1’], x[‘c2’]), axis = 1)

但是它比下面的這個命令慢得多:

df[‘maximum’] = df[[‘c1’,’c2']].max(axis =1)

注意:如果能用其他內置函數完成相同的程序,就盡量不要用 apply,因為內置函數通常更快。例如,想要將列' c '四舍五入為整數,可以使用 round(df[‘c’], 0),而不是 apply 函數。

6、value counts

這是一個統計查看值分布情況的命令。如果您想看一下“c”列中有多少不同的值,以及每個值出現的頻率,可以這樣做:

df[‘c’].value_counts() 

下面還給大家總結了一些有用的技巧:

A.   normalize = True:此句用於檢查頻率而不是計數。

B.   dropna = False:可以在統計中包含缺失值。

C.   sort = False:統計信息按值排序而不是按計數排序。

D.    df[‘c].value_counts().reset_index():將統計表轉換為 panda 數據表再處理。

7、缺失值統計

在構建模型時,如果想要排除缺失值或有缺失值所屬的行,可以使用.isnull() 和 .sum() 來處理。

import pandas as pd
import numpy as np
df = pd.DataFrame({ ‘id’: [1,2,3], ‘c1’:[0,0,np.nan], ‘c2’: [np.nan,1,1]})
df = df[[‘id’, ‘c1’, ‘c2’]]
df[‘num_nulls’] = df[[‘c1’, ‘c2’]].isnull().sum(axis=1)
df.head()

8、選擇具有特定 id 的行

在SQL中,我們可以使用 SELECT * FROM … WHERE ID in (‘A001’, ‘C022’, …) 來獲取具有特定 ID 的記錄。在 Pandas 中你可以這么做:

df_filter = df[‘ID’].isin([‘A001’,‘C022’,...])
df[df_filter]

9、分組:按照百分比

給一個數值列,希望對該列中的值進行分組,比如前 5% 的值分為 組1,5% - 20% 的值分為 組2,20% -50% 的值分為 組3,剩余 50% 的值分為組4。當然 Pandas 有很多種方法,但在這里提供一種新方法,其運行速度會很快(因為沒有使用 apply 函數):

import numpy as np
cut_points = [np.percentile(df[‘c’], i) for i in [50, 80, 95]]
df[‘group’] = 1
for i in range(3):
    df[‘group’] = df[‘group’] + (df[‘c’] < cut_points[i])
# or <= cut_points[i]

10、to_csv

這是一個大家都會用到的通用的命令。不過我會再單獨指出兩個使用技巧,第一個是:

print(df[:5].to_csv())

此命令可以准確地打印出將要寫入文件的前五行數據。

另一個技巧是 float_format=‘%.0f’。

用於處理整數值和空缺值混合在一起的情況。如果一列同時包含缺失值和整數值,那么寫入的數據類型仍然是 float 而不是 int 型。在導出數據表時,可以通過添加 float_format=‘%.0f’ 將所有浮點數四舍五入為整數。如果希望所有列輸出的都是整數,那么這個技巧也可以幫你擺脫煩人的 ‘.0’ 格式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM