11個Python Pandas小技巧讓你的工做更高效(附代碼實例)

本文爲你介紹Pandas隱藏的炫酷小技巧,我相信這些會對你有所幫助。linux

或許本文中的某些命令你早已知曉,只是沒意識到它還有這種打開方式。bash

image.png

Pandas是一個在Python中普遍應用的數據分析包。市面上有不少關於Pandas的經典教程,但本文介紹幾個隱藏的炫酷小技巧,我相信這些會對你有所幫助。app

  1. read_csv

這是讀取數據的入門級命令。當要你所讀取的數據量特別大時,試着加上這個參數 nrows = 5,就能夠在載入所有數據前先讀取一小部分數據。如此一來,就能夠避免選錯分隔符這樣的錯誤啦(數據不必定都是用逗號來分隔)。函數

(或者在linux系統中,你可使用‘head’來展現任意文本文件的前五行:head -c 5 data.txt)ui

接下來,用 df.columns.tolist() 能夠提取每一列並轉換成list。還能夠加上 usecols = [‘c1’, ‘c2’, … ]來載入所須要的指定列。另外,若是你知道某些列的類型,你能夠加上dtype = {‘c1’: str, ‘c2’: int, …} ,這樣會加快載入的速度。加入這些參數的另外一大好處是,若是這一列中同時含有字符串和數值類型,而你提早聲明把這一列看做是字符串,那麼這一列做爲主鍵來融合多個表時,就不會報錯了。阿里雲

  1. select_dtypes

若是已經在Python中完成了數據的預處理,這個命令能夠幫你節省必定的時間。在讀取了表格以後,每一列的默認數據類型將會是bool,int64,float64,object,category,timedelta64,或者datetime64。首先你能夠觀察一下大體狀況,使用:編碼

df.dtypes.value_counts()
來了解你的dataframe的每項數據類型,而後再使用:spa

df.select_dtypes(include=['float64', 'int64'])複製代碼

獲取一個僅由數值類型組成的sub-dataframe。指針

  1. copy

若是你沒據說過它的話,我不得強調它的重要性。輸入下面的命令:code

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)複製代碼
  1. map

這個炫酷的命令讓你的數據轉換變得輕鬆。首先定義一個

dictionary,「key」是轉換前的舊值,而「values」是轉換後的新值。

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

幾個適用情景:把True、False,轉換成一、0(爲了建模);定義級別;使用字典編碼。

  1. 用不用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)
複製代碼

但你會發現相比於如下命令,apply實在是慢太多了:

df['maximum'] = df[['c1','c2']].max(axis =1)
複製代碼

結論:若是你能夠採用其餘內置函數(他們通常速度更快),請不要使用apply。好比說,若是你想把「c」列的值近似取整,那麼請用round(df[‘c’], 0)或df['c'],round(0)而不是上文的apply函數。

  1. value counts

這個命令用於檢查值的分佈。你想要檢查下「c」列中出現的值以及每一個值所出現的頻率,可使用:

df['c'].value_counts(
複製代碼

下面是一些有用的小技巧/參數:

normalize = True:查看每一個值出現的頻率而不是頻次數。

dropna = False: 把缺失值也保留在此次統計中。

sort = False: 將數據按照值來排序而不是按照出現次數排序。複製代碼

df[‘c].value_counts().reset_index(): 將這個統計表轉換成pandas的dataframe而且進行處理。

  1. 缺失值的數量

當構建模型時,咱們可能會去除包含過多缺失值或是所有是缺失值的行。這時可使用.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()複製代碼
  1. 依據指定ID來選取行

在SQL中咱們可使用 SELECT * FROM … WHERE ID in (‘A001’,‘C022’, …)來獲取含有指定ID的記錄。若是你也想在Pandas中作相似的事情,你可使用:

df_filter = df['ID'].isin(['A001','C022',...])
df[df_filter]複製代碼
  1. 基於分位數分組

面對一列數值,你想將這一列的值進行分組,好比說最前面的5%放入組別一,5-20%放入組別二,20%-50%放入組別三,最後的50%放入組別四。固然,你可使用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]複製代碼

這種方法的運行速度很快(並無使用到apply函數)。

  1. to_csv

這又是一個你們都會用的命令。我想在這裏列出兩個小技巧。首先是

print(df[:5].to_csv())
你可使用這個命令打印出將要輸出文件中的前五行記錄。

另外一個技巧是用來處理整數值和缺失值混淆在一塊兒的狀況。若是一列含有缺失值和整數值,那麼這一列的數據類型會變成float而不是int。當導出表格時,你能夠加上float_format=‘%.0f’以便將全部的浮點數近似成整數。當你想把全部列的輸出值都變成整數格式時,就可使用這個技巧,這樣一來你就會告別全部數值後帶「.0」的煩惱。

文章來自阿里雲開發者社區

原文連接:developer.aliyun.com/article/715…

相關文章
相關標籤/搜索