您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Pandas數(shù)據(jù)分析實(shí)用小技巧有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
小技巧1:如何使用map對某些列做特征工程?
先生成數(shù)據(jù):
d = {"gender":["male", "female", "male","female"],"color":["red", "green", "blue","green"],"age":[25, 30, 15, 32] }df = pd.DataFrame(d)df
在 gender
列上,使用 map 方法,快速完成如下映射:
d = {"male": 0, "female": 1} df["gender2"] = df["gender"].map(d)
Pandas 的強(qiáng)項(xiàng)在于數(shù)據(jù)分析,自然就少不了數(shù)據(jù)清洗。
一個(gè)快速清洗數(shù)據(jù)的小技巧,在某列上使用 replace 方法和正則,快速完成值的清洗。
源數(shù)據(jù):
d = {"customer": ["A", "B", "C", "D"],"sales":[1100, "950.5RMB", "$400", " $1250.75"]} df = pd.DataFrame(d)df
打印結(jié)果:
customer sales 0 A 11001 B 950.5RMB 2 C $4003 D $1250.75
看到 sales 列的值,有整型,浮點(diǎn)型+RMB后變?yōu)樽址?,還有美元+整型,美元+浮點(diǎn)型。
我們的目標(biāo):清洗掉 RMB
,$
符號(hào),轉(zhuǎn)化這一列為浮點(diǎn)型。
一行代碼搞定:(點(diǎn)擊代碼區(qū)域,向右滑動(dòng),查看完整代碼)
df["sales"] = df["sales"].replace("[$,RMB]","", regex = True) \ .astype("float")
使用正則替換,將要替換的字符放到列表中 [$,RMB]
,替換為空字符,即""
;
最后使用 astype
轉(zhuǎn)為 float
打印結(jié)果:
customer sales0 A 1100.001 B 950.502 C 400.003 D 1250.75
如果不放心,再檢查下值的類型:
df["sales"].apply(type)
打印結(jié)果:
0 <class 'float'>1 <class 'float'>2 <class 'float'>3 <class 'float'>
構(gòu)造一個(gè) DataFrame:
d = {\"district_code": [12345, 56789, 101112, 131415],"apple": [5.2, 2.4, 4.2, 3.6],"banana": [3.5, 1.9, 4.0, 2.3],"orange": [8.0, 7.5, 6.4, 3.9]}df = pd.DataFrame(d)df
打印結(jié)果:
district_code apple banana orange0123455.23.58.01567892.41.97.521011124.24.06.431314153.62.33.9
5.2 表示 12345 區(qū)域的 apple 價(jià)格,并且 apple, banana, orange,這三列都是一種水果,那么如何把這三列合并為一列?
使用 pd.melt
具體參數(shù)取值,根據(jù)此例去推敲:
df = df.melt(\ id_vars = "district_code", var_name = "fruit_name", value_name = "price") df
打印結(jié)果:
district_code fruit_name price012345 apple 5.2156789 apple 2.42101112 apple 4.23131415 apple 3.6412345 banana 3.5556789 banana 1.96101112 banana 4.07131415 banana 2.3812345 orange 8.0956789 orange 7.510101112 orange 6.411131415 orange 3.9
以上就是長 DataFrame,對應(yīng)的原 DataFrame 是寬 DF.
小技巧4:已知 year 和 dayofyear,怎么轉(zhuǎn) datetime?
原 DataFrame
d = {\"year": [2019, 2019, 2020],"day_of_year": [350, 365, 1] }df = pd.DataFrame(d)df
打印結(jié)果:
year day_of_year 0201935012019365220201
轉(zhuǎn) datetime 的 小技巧
步驟 1: 創(chuàng)建整數(shù)
df["int_number"] = df["year"]*1000 + df["day_of_year"]
打印 df 結(jié)果:
year day_of_year int_number 0201935020193501201936520193652202012020001
步驟 2: to_datetime
df["date"]=pd.to_datetime(df["int_number"],format = "%Y%j")
注意 "%Y%j" 中轉(zhuǎn)化格式 j
打印結(jié)果:
year day_of_year int_number date 0201935020193502019-12-161201936520193652019-12-3122020120200012020-01-01
這也是我們在數(shù)據(jù)清洗、特征構(gòu)造中面臨的一個(gè)任務(wù)。
如下一個(gè) DataFrame:
d = {"name":['Jone','Alica','Emily','Robert','Tomas','Zhang','Liu','Wang','Jack','Wsx','Guo'],"categories": ["A", "C", "A", "D", "A","B", "B", "C", "A", "E", "F"]} df = pd.DataFrame(d)df
結(jié)果:
name categories 0 Jone A1 Alica C2 Emily A3 Robert D4 Tomas A5 Zhang B6 Liu B7 Wang C8 Jack A9 Wsx E10 Guo F
D、E、F 僅在分類中出現(xiàn)一次,A 出現(xiàn)次數(shù)較多。
步驟 1:統(tǒng)計(jì)頻次,并歸一
frequencies = df["categories"].value_counts(normalize = True) frequencies
結(jié)果:
A 0.363636B 0.181818C 0.181818F 0.090909E 0.090909D 0.090909Name: categories, dtype: float64
步驟 2:設(shè)定閾值,過濾出頻次較少的值
threshold = 0.1small_categories = frequencies[frequencies < threshold].indexsmall_categories
結(jié)果:
Index(['F', 'E', 'D'], dtype='object')
步驟 3:替換值
df["categories"] = df["categories"] \ .replace(small_categories, "Others")
替換后的 DataFrame:
name categories 0 Jone A1 Alica C2 Emily A3 Robert Others4 Tomas A5 Zhang B6 Liu B7 Wang C8 Jack A9 Wsx Others10 Guo Others
感謝各位的閱讀!關(guān)于“Pandas數(shù)據(jù)分析實(shí)用小技巧有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。