10招!看骨灰級Pythoner如何玩轉Python

  • 2019 年 10 月 8 日
  • 筆記

pandas是基於numpy構建的,使數據分析工作變得更快更簡單的高級數據結構和操作工具。本文為大家帶來10個玩轉Python的小技巧,學會了分分鐘通關變大神!

1. read_csv

每個人都知道這個命令。但如果你要讀取很大的數據,嘗試添加這個參數:nrows = 5,以便在實際加載整個表之前僅讀取表的一小部分。然後你可以通過選擇錯誤的分隔符來避免錯誤(它不一定總是以逗號分隔)。

(或者,你可以在linux中使用 head 命令來檢查任何文本文件中的前5行,例如:head -c 5 data.txt)

然後,你可以使用df.columns.tolist()來提取列表中的所有列,然後添加usecols = [ c1 , c2 ,…]參數以加載所需的列。此外,如果你知道幾個特定列的數據類型,則可以添加參數dtype = { c1 :str, c2 :int,…},以便數據加載得更快。此參數還有另一個優點,如果你有一個同時包含字符串和數字的列,那麼將其類型聲明為字符串是一個好選擇,這樣就可以在嘗試使用此列作為鍵去合併表時不會出錯。

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

這是一個可以進行簡單數據轉換的命令。首先定義一個字典,其中 keys 是舊值, values 是新值。

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

舉幾個例子:True,False為1,0(用於建模); 定義水平; 用戶定義的詞法編碼。

5. apply or not 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()

在上面的代碼中,我們定義了一個帶有兩個輸入變量的函數,並使用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函數:

df.apply(lambda x: round(x[ c ], 0), axis = 1)  

6. value counts

這是一個檢查值分佈的命令。例如,如果你想檢查「c」列中每個值的可能值和頻率,可以執行以下操作

df[『c』].value_counts()  # 它有一些有用的技巧/參數:  normalize = True #如果你要檢查頻率而不是計數。  dropna = False #如果你要統計數據中包含的缺失值。  df[ c ].value_counts().reset_index()  #如果你想將stats錶轉換成pandas數據幀並進行操作。  df[ c ].value_counts().reset_index().sort_values(by= index )  #顯示按值而不是按計數排序的統計數據。  

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( A001 , C022 ,…)來獲取具有特定ID的記錄。如果想用Pandas做同樣的事情,你可以

df_filter = df[『ID』].isin([『A001』,『C022』,...])  df[df_filter]  

9. Percentile groups

你有一個數字列,並希望將該列中的值分類為組,例如將列的前5%,分為組1,前5-20%分為組2,前20%-50%分為組3,最後50%分為組4。當然,你可以用pandas.cut來做,但這裡提供另一個選擇:

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而不是int。導出表時,可以添加float_format = %。0f 將所有浮點數舍入為整數。如果只想要所有列的整數輸出,請使用此技巧,你將擺脫所有令人苦惱的 .0 。