10個Python Pandas技巧,使您的工作更有效率

Pandas是一個廣泛用於結構化數據的Python包。本文將介紹一些讀者可能以前不知道的很實用的技巧。

read_csv


每個人都知道這個命令。但是讀取的數據很大,可以嘗試添加這個參數:nrows = 5以便在實際加載整個表之前讀取表的一小部分。然後你可以通過選擇錯誤的分隔符來避免錯誤(它可能不總是以逗號分隔)。或者,您可以在linux中使用’head’命令檢查任何文本文件中的前5行(比如說):head -n 5 data.txt

然後,您可以通過使用df.columns.tolist()提取所有列來提取列列表,然後添加**usecols = [‘c1’,‘c2’,…]參數來加載您需要的列。此外,如果您知道幾個特定列的數據類型,則可以添加參數dtype = {‘c1’:str,‘c2’:int,…},**以便加載更快。這個參數的另一個優點是,如果您有一個同時包含字符串和數字的列,那麼將它的類型聲明爲string是一個很好的實踐,這樣在試圖使用該列作爲鍵合併表時就不會出現錯誤。

select_dtypes


如果數據預處理必須在Python中完成,那麼這個命令可以節省你一些時間。讀入表後,每列的默認數據類型可以是bool,int64,float64,object,category,timedelta64或datetime64。您可以先用df.dtypes.value_counts(),要了解數據幀的所有可能數據類型,然後執行df.select_dtypes(include=[‘float64’, ‘int64’])

選擇僅具有數字特徵的子數據幀。

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)

map


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

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

一些例子:True, False to 1, 0 (for modeling); defining levels; user defined lexical encodings.

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’。

但**“應用”的問題是它有時太慢了**。如果你想計算兩列“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)或df [‘c’]。round(0)而不是使用apply函數:df.apply(lambda x: round(x[‘c’], 0), axis = 1)。

value counts


這是檢查值分佈的命令。例如,如果您想檢查“c”列中每個值的可能值和頻率,您可以執行此操作:df[‘c’].value_counts()

還有就是它的一些有用的技巧/參數:
A. normalize = True:如果您想檢查頻率而不是計數。
B. dropna = False:如果您還想在統計中包含缺失的值。
C. df[‘c’].value_counts().reset_index():如果希望將stats錶轉換爲panda數據aframe並對其進行操作。
D. df[‘c’].value_counts().reset_index().sort_values(by=‘index’):在’c’列中顯示按不同值排序的統計信息,而不是count。

number of missing values


構建模型時,您可能希望排除具有太多缺失值的行/具有所有缺失值的行。您可以使用.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()

select rows with specific IDs


在SQL中,我們可以使用SELECT * FROM … WHERE ID(‘A001’,‘C022’,…)來獲取具有特定ID的記錄。如果你想用熊貓做同樣的事情,你可以做到

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

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]

這是快速運行(沒有使用應用功能)。

to_csv


這也是每個人都會使用的命令。我想在這裏指出兩個技巧。第一個是:print(df[:5].to_csv())

您可以使用此命令打印出準確寫入文件的前五行。

另一個技巧是處理混合在一起的整數和缺失值。如果列包含缺失值和整數,則數據類型仍將是float而不是int。導出表時,可以添加**float_format =’%。0f’**將所有浮點數舍入爲整數。如果您只想要所有列的整數輸出,請使用此技巧 - 您將擺脫所有惱人的’.0’。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章