国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Pandas之旅(二): 有關(guān)數(shù)據(jù)清理的點(diǎn)點(diǎn)滴滴

wenyiweb / 1100人閱讀

摘要:數(shù)據(jù)清洗大家好,這一期我將為大家?guī)?lái)我的學(xué)習(xí)心得第二期數(shù)據(jù)清理。這一期我會(huì)和大家分享一些比較好用常見(jiàn)的清洗方法。首先還是讓我們來(lái)簡(jiǎn)單看一下本文將會(huì)用到的數(shù)據(jù)源這是一個(gè)超小型的房地產(chǎn)行業(yè)的數(shù)據(jù)集,大家會(huì)在文章最后找到下載地址。

數(shù)據(jù)清洗

大家好,這一期我將為大家?guī)?lái)我的pandas學(xué)習(xí)心得第二期:數(shù)據(jù)清理。這一步非常重要,一般在獲取數(shù)據(jù)源之后,我們緊接著就要開(kāi)始這一步,以便為了之后的各種操作,簡(jiǎn)單來(lái)說(shuō),我們的目標(biāo)就是讓數(shù)據(jù)看起來(lái)賞心悅目,規(guī)規(guī)矩矩的,所以我們會(huì)對(duì)原始的dataframe做一些必要的美容,包括規(guī)范命名,去除異常值,重新選擇合適的index啊,處理缺失值,統(tǒng)一列的命名等等。

這一期我會(huì)和大家分享一些比較好用常見(jiàn)的清洗方法。首先還是讓我們來(lái)簡(jiǎn)單看一下本文將會(huì)用到的數(shù)據(jù)源:

property_data.csv 這是一個(gè)超小型的房地產(chǎn)行業(yè)的數(shù)據(jù)集,大家會(huì)在文章最后找到下載地址。

這篇文章我會(huì)從以下幾個(gè)方面來(lái)和大家分享我的心得體會(huì):

有關(guān)缺失值的處理

有關(guān)列的處理

設(shè)置Index

源碼及數(shù)據(jù)下載地址

1.有關(guān)缺失值的處理

這里我們會(huì)用到 property_data.csv這個(gè)數(shù)據(jù)集,在開(kāi)始處理缺失值之前,我們可以先話一分鐘仔細(xì)想想,為什么實(shí)際生活中的數(shù)據(jù)從來(lái)是不完整的,原因基本有幾個(gè)方面:

用戶忘記填寫字段

從舊數(shù)據(jù)庫(kù)手動(dòng)傳輸時(shí)數(shù)據(jù)丟失

代碼中有bug

用戶不填寫非必須字段(比如注冊(cè)的時(shí)候)

因?yàn)檫@些原因,我每次在處理missing value的時(shí)候都會(huì)問(wèn)自己兩個(gè)基礎(chǔ)問(wèn)題:

數(shù)據(jù)集每一列有什么特點(diǎn)?

我們想要在處理后得到什么類型的數(shù)據(jù)(int,float,string,boolean)?

帶著這些疑問(wèn),我們可以開(kāi)始了,首先讓我們簡(jiǎn)單讀取一下數(shù)據(jù),利用head函數(shù)看看前5行,如果你還對(duì)pandas的基礎(chǔ)知識(shí)有疑問(wèn),可以看看我上一篇文章:Pandas之旅(一): 讓我們把基礎(chǔ)知識(shí)一次擼完,申精干貨

import pandas as pd
import numpy as np
import os
os.chdir("F:Python教程segmentfaultpandas_sharePandas之旅_02 數(shù)據(jù)清洗")
# Read csv file into a pandas dataframe
df = pd.read_csv("property_data.csv")

# Take a look at the first few rows
df.head()
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 NaN LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600

現(xiàn)在讓我們看看數(shù)據(jù)的一些關(guān)鍵列是什么:

ST_NUM:街道號(hào)碼

ST_NAME: 街道名稱

OWN_OCCUPIED: 是否用于自住

NUM_BEDROOMS:臥室數(shù)量

SQ_FT:面積

這里可以給大家普及點(diǎn)房地產(chǎn)知識(shí),有的時(shí)候房屋用途被明確規(guī)定,比如有的房產(chǎn)寫的是"owner occupied only ")意思是說(shuō)如果你買了,那這個(gè)房子會(huì)成為你的主要住所,不能用于出租之類的,簡(jiǎn)單理解就是自住

所以現(xiàn)在我可以自問(wèn)自答第一個(gè)問(wèn)題:數(shù)據(jù)集每一列有什么特點(diǎn)?

ST_NUM:float或int ...

ST_NAME:string

OWN_OCCUPIED:string ... Y(“是”)或N(“否”)

NUM_BEDROOMS:float或int,數(shù)字類型

SQ_FT:float或int,數(shù)字類型

1.1 規(guī)范的缺失值標(biāo)記

現(xiàn)在讓我們關(guān)注ST_NUM這一列:

# Looking at the ST_NUM column
df["ST_NUM"]
0    104.0
1    197.0
2      NaN
3    201.0
4    203.0
5    207.0
6      NaN
7    213.0
8    215.0
Name: ST_NUM, dtype: float64


如果想查看該列的缺失值情況,我們可以利用isnull()方法,如果出現(xiàn)缺失值,會(huì)返回True,反之返回false

df["ST_NUM"].isnull()
0    False
1    False
2     True
3    False
4    False
5    False
6     True
7    False
8    False
Name: ST_NUM, dtype: bool


但是其實(shí)如果我們打開(kāi)csv文件,你會(huì)發(fā)現(xiàn)第3行是空白,還有一行在該列顯示的是NA,所以結(jié)論已經(jīng)有了:在pandas里表示缺省值的符號(hào)及時(shí)NA,換句話說(shuō),如果我們要表示缺省值,標(biāo)準(zhǔn)寫法是NA

1.2 不規(guī)范的缺失值標(biāo)記

同樣的,這回讓我們關(guān)注一下NUM_BEDROOMS這一列,我們發(fā)現(xiàn)出現(xiàn)了4種類型的表達(dá)缺省值的標(biāo)記:

n/a

NA

na

通過(guò)剛才的實(shí)踐,我們已經(jīng)確定NA是pandas可以識(shí)別的,那么其他的符號(hào)呢,現(xiàn)在讓我們來(lái)測(cè)試一下

df["NUM_BEDROOMS"]
0      3
1      3
2    NaN
3      1
4      3
5    NaN
6      2
7      1
8     na
Name: NUM_BEDROOMS, dtype: object



df["NUM_BEDROOMS"].isnull()
0    False
1    False
2     True
3    False
4    False
5     True
6    False
7    False
8    False
Name: NUM_BEDROOMS, dtype: bool


可以看到pandas識(shí)別了n/a 和NA兩種符號(hào),但是接下來(lái)我們要考慮一個(gè)問(wèn)題,假設(shè)你是房地產(chǎn)公司的地區(qū)總經(jīng)理,你每周會(huì)收到不同地區(qū)的負(fù)責(zé)人提交的表格,
這些人中有的喜歡用--表示空白值,有的人喜歡用na,那應(yīng)該怎么辦?

最簡(jiǎn)單的方式就是將所有表示空白值的符號(hào)統(tǒng)一放在list中,讓后讓pandas一次性識(shí)別:

# Making a list of missing value types
missing_values =  ["na", "--"]
df = pd.read_csv("property_data.csv", na_values = missing_values)

現(xiàn)在我們來(lái)看看到底發(fā)生了什么?

df
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3.0 1 1000.0
1 100002000.0 197.0 LEXINGTON N 3.0 1.5 NaN
2 100003000.0 NaN LEXINGTON N NaN 1 850.0
3 100004000.0 201.0 BERKELEY 12 1.0 NaN 700.0
4 NaN 203.0 BERKELEY Y 3.0 2 1600.0
5 100006000.0 207.0 BERKELEY Y NaN 1 800.0
6 100007000.0 NaN WASHINGTON NaN 2.0 HURLEY 950.0
7 100008000.0 213.0 TREMONT Y 1.0 1 NaN
8 100009000.0 215.0 TREMONT Y NaN 2 1800.0

我們可以發(fā)現(xiàn)只要missing_value中記錄的表達(dá)空白值的符號(hào),全部變成了規(guī)整的NaN

1.3 類型不一致的異常值

剛剛我們已經(jīng)簡(jiǎn)單了解了在pandas中如何處理缺失值的,還有一種情況,讓我們來(lái)看OWN_OCCUPIED這一列,這一列的答案只能是Y,N 但是我們發(fā)現(xiàn)數(shù)據(jù)集意外地出現(xiàn)了12,屬于類型不對(duì)稱

df["OWN_OCCUPIED"].isnull()
0    False
1    False
2    False
3    False
4    False
5    False
6     True
7    False
8    False
Name: OWN_OCCUPIED, dtype: bool

現(xiàn)在我們發(fā)現(xiàn)12是異常值,因?yàn)樗穷愋湾e(cuò)誤,所以我們可以簡(jiǎn)單通過(guò)下面這個(gè)方法來(lái)檢測(cè),

# Detecting numbers 
cnt=0
for row in df["OWN_OCCUPIED"]:
    try:
        int(row)
        df.loc[cnt, "OWN_OCCUPIED"]=np.nan
    except ValueError:
        pass
    cnt+=1

我們這里的策略是:

循環(huán)遍歷OWN_OCCUPIED列

嘗試將條目轉(zhuǎn)換為整數(shù)

如果條目可以更改為整數(shù),請(qǐng)輸入缺失值

如果數(shù)字不能是整數(shù),我們知道它是一個(gè)字符串,所以繼續(xù)

這樣我們會(huì)把OWN_OCCUPIED這一列中所有類型不對(duì)的值轉(zhuǎn)化為NaN,現(xiàn)在來(lái)看結(jié)果:

df["OWN_OCCUPIED"]
0      Y
1      N
2      N
3    NaN
4      Y
5      Y
6    NaN
7      Y
8      Y
Name: OWN_OCCUPIED, dtype: object


1.4 匯總?cè)笔е?/b>

pandas提供了更為簡(jiǎn)潔的方式,可以讓我們整體了解所有column的空值:

df.isnull().sum()
PID             1
ST_NUM          2
ST_NAME         0
OWN_OCCUPIED    2
NUM_BEDROOMS    3
NUM_BATH        1
SQ_FT           2
dtype: int64


或者如果我們只想知道數(shù)據(jù)是否存在空值,那么可以使用以下的命令:

# Any missing values?
df.isnull().values.any()
True


1.5 替換缺失值

如果我們想要替換掉缺失值,可以用fillna方法

# Replace missing values with a number
df["ST_NUM"].fillna(125, inplace=True)

或者我們可以通過(guò)準(zhǔn)確定位來(lái)替換缺失值:

# Location based replacement
df.loc[2,"ST_NUM"] = 125

替換缺失值的一種非常常見(jiàn)的方法是使用中位數(shù):

# Replace using median 
median = df["NUM_BEDROOMS"].median()
df["NUM_BEDROOMS"].fillna(median, inplace=True)
df
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3.0 1 1000.0
1 100002000.0 197.0 LEXINGTON N 3.0 1.5 NaN
2 100003000.0 125.0 LEXINGTON N 2.5 1 850.0
3 100004000.0 201.0 BERKELEY NaN 1.0 NaN 700.0
4 NaN 203.0 BERKELEY Y 3.0 2 1600.0
5 100006000.0 207.0 BERKELEY Y 2.5 1 800.0
6 100007000.0 125.0 WASHINGTON NaN 2.0 HURLEY 950.0
7 100008000.0 213.0 TREMONT Y 1.0 1 NaN
8 100009000.0 215.0 TREMONT Y 2.5 2 1800.0
2. 有關(guān)列的處理 2.1 統(tǒng)一修改列名

現(xiàn)在假設(shè)因?yàn)橐恍┬枨螅枰覀兘y(tǒng)一修改列名,把列名改為小寫,我們可以結(jié)合列表推導(dǎo)式輕易實(shí)現(xiàn)

df.rename(str.lower, axis="columns",inplace =True)
df.columns
Index(["pid", "st_num", "st_name", "own_occupied", "num_bedrooms", "num_bath",
       "sq_ft"],
      dtype="object")

或者需要把列名中的_改為-:

new_cols = [c.replace("_","-") for c in df.columns]
change_dict =dict(zip(df.columns,new_cols))
df.rename(columns=change_dict,inplace=True)
df
pid st-num st-name own-occupied num-bedrooms num-bath sq-ft
0 100001000.0 104.0 PUTNAM Y 3.0 1 1000.0
1 100002000.0 197.0 LEXINGTON N 3.0 1.5 NaN
2 100003000.0 125.0 LEXINGTON N 2.5 1 850.0
3 100004000.0 201.0 BERKELEY NaN 1.0 NaN 700.0
4 NaN 203.0 BERKELEY Y 3.0 2 1600.0
5 100006000.0 207.0 BERKELEY Y 2.5 1 800.0
6 100007000.0 125.0 WASHINGTON NaN 2.0 HURLEY 950.0
7 100008000.0 213.0 TREMONT Y 1.0 1 NaN
8 100009000.0 215.0 TREMONT Y 2.5 2 1800.0

這里我沒(méi)有寫的精簡(jiǎn)一些,反而是復(fù)雜了,主要是想讓大家回憶起之前我分享的dict使用技巧中的內(nèi)容,注意這里inplace=True,導(dǎo)致的結(jié)果是我們的的確確修改了df所有的列名

2.1 根據(jù)需求新增列

假如目前我們需要新增一列,根據(jù)房屋面積大小來(lái)賦值,我們先隨意把缺失值補(bǔ)上:

df["sq-ft"].fillna("0.0")
0    1000
1     0.0
2     850
3     700
4    1600
5     800
6     950
7     0.0
8    1800
Name: sq-ft, dtype: object

然后新建一列rank來(lái)根據(jù)房屋面積大小賦值S=small,M=medium,B=big:

df["rank"]= pd.cut(df["sq-ft"], [0, 800, 1600, np.inf], labels=("S","M","B"))
df
pid st-num st-name own-occupied num-bedrooms num-bath sq-ft rank
0 100001000.0 104.0 PUTNAM Y 3.0 1 1000.0 M
1 100002000.0 197.0 LEXINGTON N 3.0 1.5 NaN NaN
2 100003000.0 125.0 LEXINGTON N 2.5 1 850.0 M
3 100004000.0 201.0 BERKELEY NaN 1.0 NaN 700.0 S
4 NaN 203.0 BERKELEY Y 3.0 2 1600.0 M
5 100006000.0 207.0 BERKELEY Y 2.5 1 800.0 S
6 100007000.0 125.0 WASHINGTON NaN 2.0 HURLEY 950.0 M
7 100008000.0 213.0 TREMONT Y 1.0 1 NaN NaN
8 100009000.0 215.0 TREMONT Y 2.5 2 1800.0 B

具體實(shí)現(xiàn)方法我們之后會(huì)說(shuō),這里主要是用到了pandas的cut方法,非常便捷

3. 設(shè)置Index

在許多情況下,使用數(shù)據(jù)的唯一值標(biāo)識(shí)字段作為其索引是有幫助的。這里可能我們的數(shù)據(jù)不太合適,因此我們先偽造一列Fake_Index來(lái)模擬真實(shí)場(chǎng)景中的真正索引

df["Fake_Index"]=["A00"+str(i) for i in range(len(df))]
df
pid st-num st-name own-occupied num-bedrooms num-bath sq-ft rank Fake_Index
0 100001000.0 104.0 PUTNAM Y 3.0 1 1000.0 M A000
1 100002000.0 197.0 LEXINGTON N 3.0 1.5 NaN NaN A001
2 100003000.0 125.0 LEXINGTON N 2.5 1 850.0 M A002
3 100004000.0 201.0 BERKELEY NaN 1.0 NaN 700.0 S A003
4 NaN 203.0 BERKELEY Y 3.0 2 1600.0 M A004
5 100006000.0 207.0 BERKELEY Y 2.5 1 800.0 S A005
6 100007000.0 125.0 WASHINGTON NaN 2.0 HURLEY 950.0 M A006
7 100008000.0 213.0 TREMONT Y 1.0 1 NaN NaN A007
8 100009000.0 215.0 TREMONT Y 2.5 2 1800.0 B A008

現(xiàn)在我們添加的最后一列非常像真正的房屋Id了,讓我們來(lái)看看這個(gè)偽造的索引是不是唯一值,可以利用is_unique來(lái)檢驗(yàn):

df.Fake_Index.is_unique
True

沒(méi)有問(wèn)題,現(xiàn)在我們可以放心地把這列設(shè)置為我們真正的索引:

df = df.set_index("Fake_Index")
df
pid st-num st-name own-occupied num-bedrooms num-bath sq-ft rank
Fake_Index
A000 100001000.0 104.0 PUTNAM Y 3.0 1 1000.0 M
A001 100002000.0 197.0 LEXINGTON N 3.0 1.5 NaN NaN
A002 100003000.0 125.0 LEXINGTON N 2.5 1 850.0 M
A003 100004000.0 201.0 BERKELEY NaN 1.0 NaN 700.0 S
A004 NaN 203.0 BERKELEY Y 3.0 2 1600.0 M
A005 100006000.0 207.0 BERKELEY Y 2.5 1 800.0 S
A006 100007000.0 125.0 WASHINGTON NaN 2.0 HURLEY 950.0 M
A007 100008000.0 213.0 TREMONT Y 1.0 1 NaN NaN
A008 100009000.0 215.0 TREMONT Y 2.5 2 1800.0 B

現(xiàn)在對(duì)數(shù)據(jù)的操作容易多了,我們很多事情可以通過(guò)索引完成:

#  根據(jù)索引名稱切片
df["A000":"A003"]
pid st-num st-name own-occupied num-bedrooms num-bath sq-ft rank
Fake_Index
A000 100001000.0 104.0 PUTNAM Y 3.0 1 1000.0 M
A001 100002000.0 197.0 LEXINGTON N 3.0 1.5 NaN NaN
A002 100003000.0 125.0 LEXINGTON N 2.5 1 850.0 M
A003 100004000.0 201.0 BERKELEY NaN 1.0 NaN 700.0 S
#  根據(jù)索引位置切片

df.iloc[1:3, 0:3]
pid st-num st-name
Fake_Index
A001 100002000.0 197.0 LEXINGTON
A002 100003000.0 125.0 LEXINGTON
# 定位到具體元素
df.iloc[1,2]
"LEXINGTON"


總結(jié)

我把這一期的ipynb文件和py文件放到了GIthub上,大家如果想要下載可以點(diǎn)擊下面的鏈接:

Github倉(cāng)庫(kù)地址: https://github.com/yaozeliang/pandas_share

這一期先講到這里,希望大家能夠繼續(xù)支持我,完結(jié),撒花

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/43325.html

相關(guān)文章

  • Pandas之旅(七) 誰(shuí)說(shuō)pandas

    摘要:下面讓我們開(kāi)始提速假設(shè)我們現(xiàn)在的電價(jià)是定值,不根據(jù)用電時(shí)間段來(lái)改變,那么中最快的方法那就是采用,這就是一個(gè)簡(jiǎn)單的矢量化操作示范。它基本是在中運(yùn)行最快的方式。 Pandas 加速 大家好,今天我們來(lái)看有關(guān)pandas加速的小技巧,不知道大家在剛剛接觸pandas的時(shí)候有沒(méi)有聽(tīng)過(guò)如下的說(shuō)法 pandas太慢了,運(yùn)行要等半天 其實(shí)我想說(shuō)的是,慢不是pandas的錯(cuò),大家要知道pandas本身...

    genedna 評(píng)論0 收藏0
  • Pandas之旅(一): 讓我們把基礎(chǔ)知識(shí)一次擼完,申精干貨

    為什么你需要pandas 大家好,今天想和大家分享一下有關(guān)pandas的學(xué)習(xí)新的,我因工作需要,從去年12月開(kāi)始接觸這個(gè)非常好用的包,到現(xiàn)在為止也是算是熟悉了一些,因此發(fā)現(xiàn)了它的強(qiáng)大之處,特意想要和朋友們分享,特別是如果你每天和excel打交道,總是需要編寫一些vba函數(shù)或者對(duì)行列進(jìn)行g(shù)roupby啊,merge,join啊之類的,相信我,pandas會(huì)讓你解脫的。 好啦,閑話少說(shuō),這篇文章的基礎(chǔ)...

    tuomao 評(píng)論0 收藏0
  • Pandas之旅(六): 字符串實(shí)用方法匯總

    摘要:有關(guān)字符串基本方法大家好,我又回來(lái)了之前的幾期我們已經(jīng)簡(jiǎn)單了解了的基礎(chǔ)操作,但是只要涉及到數(shù)據(jù),最常見(jiàn)的就是字符串類型,所以很多時(shí)候我們其實(shí)都在和字符串打交道,所以今天,我會(huì)把我自己總結(jié)的,有關(guān)字符串的常用方法分享給大家,希望能夠幫到各位小 有關(guān)字符串基本方法 大家好,我又回來(lái)了! 之前的幾期我們已經(jīng)簡(jiǎn)單了解了pandas的基礎(chǔ)操作,但是只要涉及到數(shù)據(jù),最常見(jiàn)的就是String(字符串...

    高勝山 評(píng)論0 收藏0
  • Pandas之旅(四) : 可能是社區(qū)內(nèi)最實(shí)用Pandas技巧

    摘要:不為人知的七大實(shí)用技巧大家好,我今天勤快地回來(lái)了,這一期主要是和大家分享一些的實(shí)用技巧,會(huì)在日常生活中大大提升效率,希望可以幫助到大家還是老樣子,先給大家奉上這一期的章節(jié)目錄自定義選項(xiàng),設(shè)置實(shí)用中模塊構(gòu)建測(cè)試數(shù)據(jù)巧用訪問(wèn)器合并其他列拼接使用 Pandas不為人知的七大實(shí)用技巧 大家好,我今天勤快地回來(lái)了,這一期主要是和大家分享一些pandas的實(shí)用技巧,會(huì)在日常生活中大大提升效率,希望...

    iflove 評(píng)論0 收藏0
  • Pandas之旅(五): 構(gòu)建模型初入門:檢驗(yàn)數(shù)據(jù)一致性

    摘要:如何根據(jù)需要?jiǎng)?chuàng)建簡(jiǎn)單模型大家好,今天這一期我想和大家分享有關(guān)于創(chuàng)建模型的部分,首先讓我們來(lái)看一個(gè)比較常見(jiàn)的場(chǎng)景你每天需要打開(kāi)個(gè)進(jìn)行相同的操作,各種眼花繚亂的函數(shù)后老眼昏花。。。。 Pandas 如何根據(jù)需要?jiǎng)?chuàng)建簡(jiǎn)單模型 大家好,今天這一期我想和大家分享有關(guān)于pandas創(chuàng)建模型的部分,首先讓我們來(lái)看一個(gè)比較常見(jiàn)的場(chǎng)景: 你每天需要打開(kāi)N個(gè)excel進(jìn)行相同的操作,各種眼花繚亂的VBA函...

    hqman 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<