原題 | 10 Python Pandas tricks that make your work more efficientpython
做者 | Shiu-Tang Li算法
原文 | towardsdatascience.com/10-python-p…shell
譯者 | kbsc13("算法猿的成長"公衆號做者)微信
聲明 | 翻譯是出於交流學習的目的,歡迎轉載,但請保留本文出於,請勿用做商業或者非法用途多線程
Pandas 是一個普遍應用於數據分析等領域的 Python 庫。關於它的教程有不少,但這裏會一些比較冷門可是很是有用的技巧。app
這是一個你們都應該知道的函數,由於它就是讀取 csv 文件的方法。函數
但若是須要讀取數據量很大的時候,能夠添加一個參數--nrows=5
,來先加載少許數據,這能夠避免使用錯誤的分隔符,由於並非全部的都採用逗號分隔,而後再加載整個數據集。學習
Ps. 在 Linux 的終端,能夠採用 head
命令來查看文件的前 5 行數據,命令示例以下所示:編碼
head -n 5 data.txt
複製代碼
加載數據後,能夠經過方法df.columns.tolist()
獲取全部的列名字,再採用參數usecols=['c1','c2',...]
來讀取真正須要的列。若是想讀取速度更快而且知道一些列的數據類型,可使用參數 dtype={'c1':str, 'c2':int,...}
,使用這個參數的另外一個好處是對於包含不一樣類型的列,好比同時包含字符串和整型的列,這個參數能夠指定該列就是字符串或者整型的類型,避免在採用該列做爲鍵進行融合不一樣表的時候出現錯誤。spa
若是必須用 Python 進行數據預處理,採用這個方法能夠節省一些時間。在讀取表後,默認數據類型能夠能是 bool, int64, float64, object, category, timedelta64, datetime64
,首先能夠用下面的方法來查看分佈狀況和知道 dataframe
中包含哪些數據類型:
df.dtypes.value_counts()
接着使用下面的方法來選擇特定類型的數據,好比說數字特徵:
df.select_dtypes(include=['float64', 'int64'])
這個方法很重要,首先先看看下面這個例子:
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)
複製代碼
這是一個很是酷的命令,能夠用於作簡單的數據轉化操做。首先須要定義一個字典,它的鍵是舊數值,而其值是新的數值,以下所示:
level_map = {1: 'high', 2: 'medium', 3: 'low'}
df['c_level'] = df['c'].map(level_map)
複製代碼
還有一些例子:
若是咱們想建立一個新的採用其餘列做爲輸入的列,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
方法將其應用到 df
的兩列 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'], o)
或者 df['c'].round(o)
,而不是使用apply
方法的代碼:df.apply(lambda x: round(x['c'], 0), axis=1)
這個方法用於檢查數值的分佈狀況。好比,你想知道c
列的每一個惟一數值出現的頻繁次數和可能的數值,能夠以下所示:
df['c'].value_counts()
複製代碼
這裏還有一些有趣的技巧或者參數:
df['c'].value_counts().reset_index()
:若是想對這個統計轉換爲一個 dataframe
並對其進行操做df['c'].value_counts().reset_index().sort_values(by='index')
或者是 df['c'].value_counts().sort_index()
: 實現根據列的每一個取值對統計表進行排序當構建模型的時候,咱們但願能夠刪除掉帶有太多缺失值的行,或者都是缺失值的行。這能夠經過採用.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()
複製代碼
在 SQL 中這個操做能夠經過SELECT * FROM … WHERE ID in (‘A001’, ‘C022’, …)
來獲取特定 IDs 的記錄。而在 pandas 中,能夠以下所示:
df_filter = df['ID'].isin(['A001','C022',...])
df[df_filter]
複製代碼
假設有一個都是數值類型的列,而後但願對這些數值劃分紅幾個組,好比前 5% 是第一組,5-20%是第二組,20%-50%是第三組,最後的50%是第四組。這能夠採用.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]
複製代碼
這個方法的速度很是快。
最後是一個很是經常使用的方法,保存爲 csv
文件。這裏也有兩個小技巧:
第一個就是print(df[:5].to_csv())
,這段代碼能夠打印前5行,而且也是會保存到文件的數據。
另外一個技巧是處理混合了整數和缺失值的狀況。當某一列同時有缺失值和整數,其數據類型是 float
類型而不是 int
類型。因此在導出該表的時候,能夠添加參數float_format='%.of'
來將 float
類型轉換爲整數。若是隻是想獲得整數,那麼能夠去掉這段代碼中的 .o
歡迎關注個人微信公衆號--算法猿的成長,或者掃描下方的二維碼,你們一塊兒交流,學習和進步!
推薦閱讀: