11個(gè)Python Pandas小技巧讓你的工作更高效(附代碼實(shí)例)
本文為你介紹Pandas隱藏的炫酷小技巧,我相信這些會對你有所幫助。
或許本文中的某些命令你早已知曉,只是沒意識到它還有這種打開方式。
Pandas是一個(gè)在Python中廣泛應(yīng)用的數(shù)據(jù)分析包。市面上有很多關(guān)于Pandas的經(jīng)典教程,但本文介紹幾個(gè)隱藏的炫酷小技巧,我相信這些會對你有所幫助。
1. read_csv
這是讀取數(shù)據(jù)的入門級命令。當(dāng)要你所讀取的數(shù)據(jù)量特別大時(shí),試著加上這個(gè)參數(shù)nrows = 5,就可以在載入全部數(shù)據(jù)前先讀取一小部分?jǐn)?shù)據(jù)。如此一來,就可以避免選錯分隔符這樣的錯誤啦(數(shù)據(jù)不一定都是用逗號來分隔)。
(或者在linux系統(tǒng)中,你可以使用‘head'來展示任意文本文件的前五行:head -c 5 data.txt)
接下來,用 df.columns.tolist() 可以提取每一列并轉(zhuǎn)換成list。還可以加上usecols = [‘c1', ‘c2', … ]來載入所需要的指定列。另外,如果你知道某些列的類型,你可以加上dtype = {‘c1': str, ‘c2': int, …} ,這樣會加快載入的速度。加入這些參數(shù)的另一大好處是,如果這一列中同時(shí)含有字符串和數(shù)值類型,而你提前聲明把這一列看作是字符串,那么這一列作為主鍵來融合多個(gè)表時(shí),就不會報(bào)錯了。
2. select_dtypes
如果已經(jīng)在Python中完成了數(shù)據(jù)的預(yù)處理,這個(gè)命令可以幫你節(jié)省一定的時(shí)間。在讀取了表格之后,每一列的默認(rèn)數(shù)據(jù)類型將會是bool,int64,float64,object,category,timedelta64,或者datetime64。首先你可以觀察一下大致情況,使用:
df.dtypes.value_counts()
來了解你的dataframe的每項(xiàng)數(shù)據(jù)類型,然后再使用:
df.select_dtypes(include=['float64', 'int64'])
獲取一個(gè)僅由數(shù)值類型組成的sub-dataframe。
3. copy
如果你沒聽說過它的話,我不得強(qiáng)調(diào)它的重要性。輸入下面的命令:
import pandas as pd
df1 = pd.DataFrame({ 'a':[0,0,0], 'b': [1,1,1]})
df2 = df1
df2['a'] = df2['a'] + 1
df1.head()
你會發(fā)現(xiàn)df1已經(jīng)發(fā)生了改變。這是因?yàn)閐f2 = df1并不是生成一個(gè)df1的復(fù)制品并把它賦值給df2,而是設(shè)定一個(gè)指向df1的指針。所以只要是針對df2的改變,也會相應(yīng)地作用在df1上。為了解決這個(gè)問題,你既可以這樣做:
df2 = df1.copy()
也可以這樣做:
from copy import deepcopy df2 = deepcopy(df1)
4. map
這個(gè)炫酷的命令讓你的數(shù)據(jù)轉(zhuǎn)換變得輕松。首先定義一個(gè)
dictionary,“key”是轉(zhuǎn)換前的舊值,而“values”是轉(zhuǎn)換后的新值。
level_map = {1: 'high', 2: 'medium', 3: 'low'}
df['c_level'] = df['c'].map(level_map)
幾個(gè)適用情景:把True、False,轉(zhuǎn)換成1、0(為了建模);定義級別;使用字典編碼。
5. 用不用apply?
如果我們想在現(xiàn)有幾列的基礎(chǔ)上生成一個(gè)新列,并一同作為輸入,那么有時(shí)apply函數(shù)會相當(dāng)有幫助。
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()
在上面的代碼中,我們定義了一個(gè)有兩個(gè)輸入變量的函數(shù),并依靠apply函數(shù)使其作用到列“c1”和“c2”上。
但是apply函數(shù)在有些情況下實(shí)在是太慢了。如果你是想計(jì)算“c1”和“c2”列的最大值,你當(dāng)然可以這樣去做:
df['maximum'] = df.apply(lambda x: max(x['c1'], x['c2']), axis = 1)
但你會發(fā)現(xiàn)相比于以下命令,apply實(shí)在是慢太多了:
df['maximum'] = df[['c1','c2']].max(axis =1)
結(jié)論:如果你可以采用其他內(nèi)置函數(shù)(他們一般速度更快),請不要使用apply。比如說,如果你想把“c”列的值近似取整,那么請用round(df[‘c'], 0)或df['c'],round(0)而不是上文的apply函數(shù)。
7. value counts
這個(gè)命令用于檢查值的分布。你想要檢查下“c”列中出現(xiàn)的值以及每個(gè)值所出現(xiàn)的頻率,可以使用:
df['c'].value_counts(
下面是一些有用的小技巧/參數(shù):
- normalize = True:查看每個(gè)值出現(xiàn)的頻率而不是頻次數(shù)。
- dropna = False: 把缺失值也保留在這次統(tǒng)計(jì)中。
- sort = False: 將數(shù)據(jù)按照值來排序而不是按照出現(xiàn)次數(shù)排序。
- df[‘c].value_counts().reset_index(): 將這個(gè)統(tǒng)計(jì)表轉(zhuǎn)換成pandas的dataframe并且進(jìn)行處理。
8. 缺失值的數(shù)量
當(dāng)構(gòu)建模型時(shí),我們可能會去除包含過多缺失值或是全部是缺失值的行。這時(shí)可以使用.isnull()和.sum()來計(jì)算指定列缺失值的數(shù)量。
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', …)來獲取含有指定ID的記錄。如果你也想在Pandas中做類似的事情,你可以使用:
df_filter = df['ID'].isin(['A001','C022',...]) df[df_filter]
10. 基于分位數(shù)分組
面對一列數(shù)值,你想將這一列的值進(jìn)行分組,比如說最前面的5%放入組別一,5-20%放入組別二,20%-50%放入組別三,最后的50%放入組別四。當(dāng)然,你可以使用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]
這種方法的運(yùn)行速度很快(并沒有使用到apply函數(shù))。
11. to_csv
這又是一個(gè)大家都會用的命令。我想在這里列出兩個(gè)小技巧。首先是
print(df[:5].to_csv())
你可以使用這個(gè)命令打印出將要輸出文件中的前五行記錄。
另一個(gè)技巧是用來處理整數(shù)值和缺失值混淆在一起的情況。如果一列含有缺失值和整數(shù)值,那么這一列的數(shù)據(jù)類型會變成float而不是int。當(dāng)導(dǎo)出表格時(shí),你可以加上float_format=‘%.0f'以便將所有的浮點(diǎn)數(shù)近似成整數(shù)。當(dāng)你想把所有列的輸出值都變成整數(shù)格式時(shí),就可以使用這個(gè)技巧,這樣一來你就會告別所有數(shù)值后帶“.0”的煩惱。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)一個(gè)論文下載器的過程
這篇文章主要介紹了Python實(shí)現(xiàn)一個(gè)論文下載器的過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Python實(shí)現(xiàn)動態(tài)給類和對象添加屬性和方法操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)動態(tài)給類和對象添加屬性和方法操作,涉及Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類與對象屬性、方法的動態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-02-02
python如何獲取文件當(dāng)前位置和定位某個(gè)位置
這篇文章主要介紹了python如何獲取文件當(dāng)前位置和定位某個(gè)位置,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
Python使用Matplotlib實(shí)現(xiàn)Logos設(shè)計(jì)代碼
這篇文章主要介紹了Python使用Matplotlib實(shí)現(xiàn)Logos設(shè)計(jì)代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
pytorch 中autograd.grad()函數(shù)的用法說明
這篇文章主要介紹了pytorch 中autograd.grad()函數(shù)的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
Python封裝成可帶參數(shù)的EXE安裝包實(shí)例
今天小編就為大家分享一篇Python封裝成可帶參數(shù)的EXE安裝包實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python基于exchange函數(shù)發(fā)送郵件過程詳解
這篇文章主要介紹了python基于exchange函數(shù)發(fā)送郵件過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
如何在Python中導(dǎo)入EXCEL數(shù)據(jù)
這篇文章主要介紹了使用Python處理EXCEL基礎(chǔ)操作篇1,如何在Python中導(dǎo)入EXCEL數(shù)據(jù),文中提供了解決思路和部分實(shí)現(xiàn)代碼,一起來看看吧2023-03-03

