原創(chuàng) THU數(shù)據(jù)派 2019-04-28 22:01:00 作者:Shiu-TangLi翻譯:吳振東校對:王雨桐本文約1800字,建議閱讀6分鐘。 本文為你介紹Pandas隱藏的炫酷小技巧,我相信這些會對你有所幫助。 或許本文中的某些命令你早已知曉,只是沒意識到它還有這種打開方式。 Pandas是一個在Python中廣泛應用的數(shù)據(jù)分析包。市面上有很多關于Pandas的經典教程,但本文介紹幾個隱藏的炫酷小技巧,我相信這些會對你有所幫助。 1. read_csv 這是讀取數(shù)據(jù)的入門級命令。當要你所讀取的數(shù)據(jù)量特別大時,試著加上這個參數(shù)nrows = 5,就可以在載入全部數(shù)據(jù)前先讀取一小部分數(shù)據(jù)。如此一來,就可以避免選錯分隔符這樣的錯誤啦(數(shù)據(jù)不一定都是用逗號來分隔)。 (或者在linux系統(tǒng)中,你可以使用‘head’來展示任意文本文件的前五行:head -c 5 data.txt) 接下來,用 df.columns.tolist() 可以提取每一列并轉換成list。還可以加上usecols = [‘c1’, ‘c2’, … ]來載入所需要的指定列。另外,如果你知道某些列的類型,你可以加上dtype = {‘c1’: str, ‘c2’: int, …} ,這樣會加快載入的速度。加入這些參數(shù)的另一大好處是,如果這一列中同時含有字符串和數(shù)值類型,而你提前聲明把這一列看作是字符串,那么這一列作為主鍵來融合多個表時,就不會報錯了。 2. select_dtypes 如果已經在Python中完成了數(shù)據(jù)的預處理,這個命令可以幫你節(jié)省一定的時間。在讀取了表格之后,每一列的默認數(shù)據(jù)類型將會是bool,int64,float64,object,category,timedelta64,或者datetime64。首先你可以觀察一下大致情況,使用: df.dtypes.value_counts() 來了解你的dataframe的每項數(shù)據(jù)類型,然后再使用: df.select_dtypes(include=['float64', 'int64']) 獲取一個僅由數(shù)值類型組成的sub-dataframe。 3. copy 如果你沒聽說過它的話,我不得強調它的重要性。輸入下面的命令: import pandas as pd 你會發(fā)現(xiàn)df1已經發(fā)生了改變。這是因為df2 = df1并不是生成一個df1的復制品并把它賦值給df2,而是設定一個指向df1的指針。所以只要是針對df2的改變,也會相應地作用在df1上。為了解決這個問題,你既可以這樣做: df2 = df1.copy() 也可以這樣做: from copy import deepcopy 4. map 這個炫酷的命令讓你的數(shù)據(jù)轉換變得輕松。首先定義一個 dictionary,“key”是轉換前的舊值,而“values”是轉換后的新值。 level_map = {1: 'high', 2: 'medium', 3: 'low'} 幾個適用情景:把True、False,轉換成1、0(為了建模);定義級別;使用字典編碼。 5. 用不用apply? 如果我們想在現(xiàn)有幾列的基礎上生成一個新列,并一同作為輸入,那么有時apply函數(shù)會相當有幫助。 def rule(x, y): 在上面的代碼中,我們定義了一個有兩個輸入變量的函數(shù),并依靠apply函數(shù)使其作用到列“c1”和“c2”上。 但是apply函數(shù)在有些情況下實在是太慢了。如果你是想計算“c1”和“c2”列的最大值,你當然可以這樣去做: df['maximum'] = df.apply(lambda x: max(x['c1'], x['c2']), axis = 1) 但你會發(fā)現(xiàn)相比于以下命令,apply實在是慢太多了: df['maximum'] = df[['c1','c2']].max(axis =1) 結論:如果你可以采用其他內置函數(shù)(他們一般速度更快),請不要使用apply。比如說,如果你想把“c”列的值近似取整,那么請用round(df[‘c’], 0)或df['c'],round(0)而不是上文的apply函數(shù)。 7. value counts 這個命令用于檢查值的分布。你想要檢查下“c”列中出現(xiàn)的值以及每個值所出現(xiàn)的頻率,可以使用: df['c'].value_counts( 下面是一些有用的小技巧/參數(shù):
8. 缺失值的數(shù)量 當構建模型時,我們可能會去除包含過多缺失值或是全部是缺失值的行。這時可以使用.isnull()和.sum()來計算指定列缺失值的數(shù)量。 import pandas as pd 9. 依據(jù)指定ID來選取行 在SQL中我們可以使用 SELECT * FROM … WHERE ID in (‘A001’,‘C022’, …)來獲取含有指定ID的記錄。如果你也想在Pandas中做類似的事情,你可以使用: df_filter = df['ID'].isin(['A001','C022',...]) 10. 基于分位數(shù)分組 面對一列數(shù)值,你想將這一列的值進行分組,比如說最前面的5%放入組別一,5-20%放入組別二,20%-50%放入組別三,最后的50%放入組別四。當然,你可以使用pandas.cut,但你也可以使用下面這種選擇: import numpy as np 這種方法的運行速度很快(并沒有使用到apply函數(shù))。 11. to_csv 這又是一個大家都會用的命令。我想在這里列出兩個小技巧。首先是 print(df[:5].to_csv()) 你可以使用這個命令打印出將要輸出文件中的前五行記錄。 另一個技巧是用來處理整數(shù)值和缺失值混淆在一起的情況。如果一列含有缺失值和整數(shù)值,那么這一列的數(shù)據(jù)類型會變成float而不是int。當導出表格時,你可以加上float_format=‘%.0f’以便將所有的浮點數(shù)近似成整數(shù)。當你想把所有列的輸出值都變成整數(shù)格式時,就可以使用這個技巧,這樣一來你就會告別所有數(shù)值后帶“.0”的煩惱。 原文標題: 10 PythonPandas tricks that make your work more efficient 原文鏈接: https:///10-python-pandas-tricks-that-make-your-work-more-efficient-2e8e483808ba 校對:林亦霖 譯者簡介 吳振東,法國洛林大學計算機與決策專業(yè)碩士?,F(xiàn)從事人工智能和大數(shù)據(jù)相關工作,以成為數(shù)據(jù)科學家為終生奮斗目標。來自山東濟南,不會開挖掘機,但寫得了Java、Python和PPT。 — 完 — |
|