先感受一下數(shù)據(jù)科學(xué)的魅力,上圖是在Smart Dubai 2017 GITEX科技周展臺上推出Smart Decision-Making Platform(智能決策平臺),于10月8日至12日在迪拜世界貿(mào)易中心舉行。游客可以通過一個“沉浸式的空間”將數(shù)據(jù)可視化,讓他們了解迪拜的未來。讓參觀者可以在現(xiàn)場查閱觀看全市數(shù)據(jù),這意味著迪拜將成為了世界上第一個與公眾分享實時實時數(shù)據(jù)的城市,同時還可以預(yù)測未來十年的發(fā)展。
最近,很多小伙伴在后臺私信我,咨詢有沒有數(shù)據(jù)處理及可視化的相關(guān)系統(tǒng)教程?我的回復(fù)是,這些庫只是工具,無需花費(fèi)很長的時間牢記這些命令的使用,學(xué)習(xí)一遍之后整理好筆記即可,遺忘之時再查找這些筆記使用即可
。
本文是博主本人結(jié)合自己的使用經(jīng)驗以及各大博主的分享精煉匯總而成
,耗時進(jìn)半個月的時候,翻閱博客和參考資料無數(shù),最后精選了最實用、常用、好用的“Pandas、Numpy、Matplotlib”三大神兵利器的方法使用攻略。
當(dāng)某個屬性數(shù)據(jù)中存在空值(NaN),則該屬性數(shù)據(jù)類型為object,使用convert_dtypes()將Series轉(zhuǎn)換為支持的dtypes。
1.convert_dtypes()處理DataFrame類型數(shù)據(jù),示例如下:
# dataframe 變量類型自動轉(zhuǎn)換df = pd.DataFrame( { "a": pd.Series([1, 2, 3], dtype=np.dtype("int32")), "b": pd.Series(["x", "y", "z"], dtype=np.dtype("O")), "c": pd.Series([True, False, np.nan], dtype=np.dtype("O")), "d": pd.Series(["h", "i", np.nan], dtype=np.dtype("O")), "e": pd.Series([10, np.nan, 20], dtype=np.dtype("float")), "f": pd.Series([np.nan, 100.5, 200], dtype=np.dtype("float")), })print(df.dtypes)dfn = df.convert_dtypes()print(dfn.dtypes)
2.convert_dtypes()處理Series變量類型數(shù)據(jù),示例如下:
# Series 變量類型自動轉(zhuǎn)換s = pd.Series(["a", "b", np.nan])print(s.dtypes)sn = s.convert_dtypes()print(sn.dtypes)
pandas可通過添加顏色條件,讓表格數(shù)據(jù)凸顯出統(tǒng)計特性。
import pandas as pddf = pd.read_csv("test.csv")
1.Fare變量值呈現(xiàn)條形圖,以清楚看出各個值得大小比較,可直接使用bar
,示例如下:
df.style.bar("Fare",vmin=0)
2.讓Age變量呈現(xiàn)背景顏色的梯度變化,以體驗映射的數(shù)值大小,那么可直接使用background_gradient
,深顏色代表數(shù)值大,淺顏色代表數(shù)值小,示例如下:
df.style.background_gradient("Greens",subset="Age")
3.讓所有缺失值都高亮出來,可使用highlight_null
,示例如下:
df.style.highlight_null()
4.pandas
的style
條件格式,組合用法非常簡單,示例如下:
df.style.bar("Fare",vmin=0).background_gradient("Greens",subset="Age").highlight_null()
使用pd.transform(func,axis)函數(shù):
func
是指定用于處理數(shù)據(jù)的函數(shù),它可以是普通函數(shù)
、字符串函數(shù)名稱
、函數(shù)列表
或軸標(biāo)簽映射函數(shù)的字典
。axis
是指要應(yīng)用到哪個軸,0
代表列,1
代表行。1.func=“普通函數(shù)”,示例如下:
df = pd.DataFrame({"A": [1,2,3], "B": [10,20,30] })def plus_10(x): return x+10df.transform(plus_10)# df.transform(lambda x: x+10) 等價寫法
2.func=“內(nèi)置的字符串函數(shù)”,示例如下:
df = pd.DataFrame({"A": [1,2,3], "B": [10,20,30] })df.transform("sqrt")
3.func=“多個映射函數(shù)”,示例如下:
df = pd.DataFrame({"A": [1,2,3], "B": [10,20,30] })df.transform([np.sqrt, np.exp])
4.func=“指定軸位置的映射函數(shù)”,示例如下:
df = pd.DataFrame({"A": [1,2,3], "B": [10,20,30] })df.transform({ "A": np.sqrt, "B": np.exp,})
工作中,比如用戶畫像的數(shù)據(jù)中也會遇到,客戶使用的app類型就會以這種長列表的形式或者以逗號隔開的字符串形式展現(xiàn)出來
。
1.使用explode()這個方法即可,一般我們會在后面跟一個去重的方法,explode()支持列表
、元組
、Series
和numpy
的ndarray
類型數(shù)據(jù),示例如下:
df.explode("愛好").drop_duplicates()
2.當(dāng)長數(shù)據(jù)不是explode能夠處理的數(shù)據(jù)類型時,使用Series.str.split()
分割字符串的方法將其轉(zhuǎn)換為列表格式后處理,然后再進(jìn)行explode即可,示例如下:
df["愛好"] = df["愛好"].str.split()
df.explode("愛好").drop_duplicates()
源數(shù)據(jù)如下:
df1 = pd.DataFrame({ "name":["A","B","C","D"], "math":[60,89,82,70], "physics":[66, 95,83,66], "chemistry":[61,91,77,70] })df2 = pd.DataFrame({ "name":["E","F","G","H"], "math":[66,95,83,66], "physics":[60, 89,82,70], "chemistry":[90,81,78,90] })
1.默認(rèn)情況下,它是沿axis=0垂直連接的,并且默認(rèn)情況下會保留df1和df2原來的索引。
pd.concat([df1,df2])
2.可以通過設(shè)置參數(shù)ignore_index=True
,這樣索引就可以從0到n-1自動排序了。
pd.concat([df1,df2],ignore_index = True)
3.如果想要沿水平軸連接兩個DataFrame
,可以設(shè)置參數(shù)axis=1
。
pd.concat([df1,df2],axis = 1)
4.可以通過設(shè)置參數(shù)verify_integrity=True
,將此設(shè)置True
為時,如果存在重復(fù)的索引,將會報錯。
pd.concat([df1,df2], verify_integrity=True)
dataframe
都有的一個簡單屬性,實現(xiàn)轉(zhuǎn)置功能。它在顯示describe
時可以很好的搭配。
boston.describe().T.head(10)
在數(shù)據(jù)探索的時候,value_counts
是使用很頻繁的函數(shù),它默認(rèn)是不統(tǒng)計空值的
,但空值往往也是我們很關(guān)心的。如果想統(tǒng)計空值,可以將參數(shù)dropna
設(shè)置為False
。
ames_housing = pd.read_csv("data/train.csv")print(ames_housing["FireplaceQu"].value_counts(dropna=False, normalize=True))
異常值檢測是數(shù)據(jù)分析中常見的操作。使用clip
函數(shù)可以很容易地找到變量范圍之外的異常值,并替換它們。
age.clip(50, 60)
源數(shù)據(jù)如下:
1.直接在dataframe的[]
中寫篩選的條件或者組合條件,示例如下:
# 篩選出大于NOX這變量平均值的所有數(shù)據(jù),然后按NOX降序排序。df[df["NOX"]>df["NOX"].mean()].sort_values(by="NOX",ascending=False).head()
#篩選出大于NOX這變量平均值且CHAS屬性值=1的所有數(shù)據(jù),然后按NOX降序排序。df[(df["NOX"]>df["NOX"].mean())& (df["CHAS"] ==1)].sort_values(by="NOX",ascending=False).head()
2.loc
按標(biāo)簽值(列名和行索引取值)訪問,iloc
按數(shù)字索引訪問,均支持單值訪問或切片查詢,loc
還可以指定返回的列變量,示例如下:
# 按df["NOX"]>df["NOX"].mean()條件篩選出數(shù)據(jù),并篩選出指定CHAS變量,然后賦值=2df.loc[(df["NOX"]>df["NOX"].mean()),["CHAS"]] = 2
3.需要鎖定某些具體的值的,這時候就需要isin
了。比如我們要限定NOX
取值只能為0.538,0.713,0.437
中時,示例如下:
df.loc[df["NOX"].isin([0.538,0.713,0.437]),:].sample(5)
# 也可以做取反操作,在篩選條件前加`~`符號df.loc[~df["NOX"].isin([0.538,0.713,0.437]),:].sample(5)
4.pandas
里實現(xiàn)字符串的模糊篩選,可以用.str.contains()
來實現(xiàn),示例如下:
train.loc[train["Name"].str.contains("Mrs|Lily"),:].head()
merge():對于擁有相同的鍵的兩個DataFrame對象,需要將其進(jìn)行有效的拼接,整合到一個對象。
def merge(left, right, how="inner", on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=("_x", "_y"), copy=True, indicator=False, validate=None)
主要參數(shù)介紹:
連接方式
,inner或outer,默認(rèn)是outer
;指定用于連接的鍵,必須存在于左右兩個DataFrame中
;使用左側(cè)DataFrame的行索引作為連接鍵(配合right_on)
;對其按照連接鍵進(jìn)行排序
;源數(shù)據(jù)為:
df1 = pd.DataFrame(np.random.randint(10, size=(3, 3)), columns=["A", "B", "C"])df2 = pd.DataFrame(np.random.randint(10, size=(2, 2)), columns=["A", "B"])
pd.merge(df1, df2, how="outer", on="B")
pd.merge(df1, df2, how="outer", left_on="B", right_on="A")
1.drop_duplicates():刪除對象dataframe中重復(fù)的行,重復(fù)通過參數(shù)subset
指定。
def drop_duplicates(subset=None, keep="first", inplace=False, ignore_index=False)
主要參數(shù)介紹:
默認(rèn)為所有的列(即每行全部相同)
;刪除重復(fù)項
,除了第1個(first)或者最后一個(last);df1 = pd.DataFrame(np.random.randint(10, size=(3, 3)), columns=["A", "B", "C"])df1.drop_duplicates("A")
2.unique():相比于drop_duplicates方法,unique()只針對于Series對象,類似于Set。 通常是對dataframe中提取某一鍵,變成Series,再去重,統(tǒng)計個數(shù)。
print(len(df1["A"].unique().tolist()))
sort_values():按照某個鍵進(jìn)行排序。 查看相同鍵時行的某些變化,如例子中在A相同時B、C的變化。
def sort_values(by, axis=0, ascending=True, kind="quicksort", na_position="last", ignore_index=False)
主要參數(shù)介紹:
指定按照哪個鍵/索引進(jìn)行排序;
默認(rèn)為升序;
指定排序方法
,‘quicksort’, ‘mergesort’, ‘heapsort;df1.sort_values(by="A")
sample():對對象進(jìn)行采樣。 當(dāng)dataframe對象數(shù)據(jù)量太大,導(dǎo)致做實驗過滿時,可以抽取一部分進(jìn)行實驗,提高效率。
def sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
主要參數(shù)介紹:
允許或不允許對同一行進(jìn)行多次采樣;
采樣的權(quán)重,默認(rèn)為“None”將導(dǎo)致相同的概率權(quán)重;
指定采樣的軸,默認(rèn)為行;
df1.sample(n=3)
df1.sample(frac=0.1)
1.isna():isna方法返回一個布爾對象,每個元素是否為NaN。
df1.isna()
2.isnull():當(dāng)數(shù)據(jù)量很大時,上述很難觀察到某列是否存在缺失,此時可以用isnull()
方法 。
df1.isnull().all() # 某列是否全部為NaN df1.isnull().any() # 某列是否出現(xiàn)NaN
3.dropna():dropna方法刪除含缺失值的行或列。
def dropna(axis=0, how="any", thresh=None, subset=None, inplace=False)
主要參數(shù)介紹:
參數(shù)為any時,行或列(axis決定)出現(xiàn)NaN時,就進(jìn)行刪除;為all時,行或列全為NaN時才進(jìn)行刪除
;文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/119548.html
摘要:請回復(fù)這個帖子并注明組織個人信息來申請加入。權(quán)限分配靈活,能者居之。數(shù)量超過個,在所有組織中排名前。網(wǎng)站日超過,排名的峰值為。導(dǎo)航歸檔社區(qū)自媒體平臺微博知乎專欄公眾號博客園簡書合作侵權(quán),請聯(lián)系請抄送一份到贊助我們 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=...
摘要:主頁暫時下線社區(qū)暫時下線知識庫自媒體平臺微博知乎簡書博客園合作侵權(quán),請聯(lián)系請抄送一份到特色項目中文文檔和教程與機(jī)器學(xué)習(xí)實用指南人工智能機(jī)器學(xué)習(xí)數(shù)據(jù)科學(xué)比賽系列項目實戰(zhàn)教程文檔代碼視頻數(shù)據(jù)科學(xué)比賽收集平臺,,劍指,經(jīng)典算法實現(xiàn)系列課本課本描述 【主頁】 apachecn.org 【Github】@ApacheCN 暫時下線: 社區(qū) 暫時下線: cwiki 知識庫 自媒體平臺 ...
摘要:主頁暫時下線社區(qū)暫時下線知識庫自媒體平臺微博知乎簡書博客園合作侵權(quán),請聯(lián)系請抄送一份到特色項目中文文檔和教程與機(jī)器學(xué)習(xí)實用指南人工智能機(jī)器學(xué)習(xí)數(shù)據(jù)科學(xué)比賽系列項目實戰(zhàn)教程文檔代碼視頻數(shù)據(jù)科學(xué)比賽收集平臺,,劍指,經(jīng)典算法實現(xiàn)系列課本課本描述 【主頁】 apachecn.org 【Github】@ApacheCN 暫時下線: 社區(qū) 暫時下線: cwiki 知識庫 自媒體平臺 ...
摘要:我們是一個大型開源社區(qū),旗下群共余人,數(shù)量超過個,網(wǎng)站日超過,擁有博客專家和簡書程序員優(yōu)秀作者認(rèn)證。我們組織公益性的翻譯活動學(xué)習(xí)活動和比賽組隊活動,并和等國內(nèi)著名開源組織保持良好的合作關(guān)系。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 我們是一個...
閱讀 2991·2021-11-16 11:45
閱讀 5194·2021-09-22 10:57
閱讀 1779·2021-09-08 09:36
閱讀 1608·2021-09-02 15:40
閱讀 2519·2021-07-26 23:38
閱讀 1208·2019-08-30 15:55
閱讀 934·2019-08-30 15:54
閱讀 1225·2019-08-29 14:06