發(fā)布時間:2024-01-24閱讀(19)

干凈整潔的數(shù)據(jù)是后續(xù)進行研究和分析的基礎(chǔ)。數(shù)據(jù)科學家們會花費大量的時間來清理數(shù)據(jù)集,毫不夸張地說,數(shù)據(jù)清洗會占據(jù)他們80%的工作時間,而真正用來分析數(shù)據(jù)的時間只占到20%左右。
所以,數(shù)據(jù)清洗到底是在清洗些什么?
通常來說,你所獲取到的原始數(shù)據(jù)不能直接用來分析,因為它們會有各種各樣的問題,如包含無效信息,列名不規(guī)范、格式不一致,存在重復(fù)值,缺失值,異常值等.....
如果你在學習Python的過程當中有遇見任何問題,可以加入我的Python交流學習qq群:250933691,多多交流問題,互幫互助,群里有不錯的學習教程和開發(fā)工具。學習python有任何問題(學習方法,學習效率,如何就業(yè)),可以隨時來咨詢我
本文會給大家介紹如何用Python中自帶的Pandas和NumPy庫進行數(shù)據(jù)清洗。在正式講解之前,先簡單介紹一下這兩個非常好用的庫。
Pandas的名稱來自于Panel data和Python數(shù)據(jù)分析data analysis,是Python的一個數(shù)據(jù)分析包,最初由AQR Capital Management于2008年4月開發(fā),被作為金融數(shù)據(jù)分析工具,為時間序列分析提供了很好的支持,并于2009年底開源出來。
NumPy是Numeric Python的縮寫,是Python的一種開源的數(shù)值計算擴展,可用來存儲和處理大型矩陣matrix,比Python自身的嵌套列表結(jié)構(gòu)要高效的多,提供了許多高級的數(shù)值編程工具,如:矩陣數(shù)據(jù)類型、矢量處理,以及精密的運算庫,專為進行嚴格的數(shù)字處理而產(chǎn)生。
目錄
一、了解數(shù)據(jù)
二、清洗數(shù)據(jù)
去除不需要的行、列
重新命名列
重新設(shè)置索引
用字符串操作規(guī)范列
用函數(shù)規(guī)范列
刪除重復(fù)數(shù)據(jù)
填充缺失值
三、總結(jié)
【注】為了清晰直觀地展示數(shù)據(jù)清洗操作,本文會用到幾個不同的數(shù)據(jù)集,重點是方法的講解。
【工具】Python 3
一、了解數(shù)據(jù)
拿到一個全新的數(shù)據(jù)集,應(yīng)該從哪里入手?
沒錯,我們需要先了解數(shù)據(jù),看看它長什么樣子。這里用tushare.pro上面的日線行情數(shù)據(jù)進行展示,以浦發(fā)銀行(600000.SH)為例。常用的方法和屬性如下:
.head()
.tail()
.shape
.columns
.info()
.describe()
.value_counts()
首先,獲取數(shù)據(jù):
importpandasaspd
importnumpyasnp
importmatplotlib.pyplotasplt
importtushareasts
pd.set_option(display.max_columns,100)# 設(shè)置顯示數(shù)據(jù)的最大列數(shù),防止出現(xiàn)省略號…,導(dǎo)致數(shù)據(jù)顯示不全
pd.set_option(expand_frame_repr,False)# 當列太多時不自動換行
pro = ts.pro_api()
df = pro.daily(ts_code=600000.SH, start_date=20190401, end_date=20190430)
.head() 查看前n行數(shù)據(jù),默認值是5
df.head()
Out[1]:
ts_codetrade_dateopenhighlowclosepre_closechangepct_chgvolamount
0 600000.SH20190430 11.7012.0911.7011.9711.480.494.26831234747.381466714.710
1 600000.SH20190429 11.3511.5411.3411.4811.320.161.4134385869.38442046.727
2 600000.SH20190426 11.4311.5611.2811.3211.54-0.22-1.9064424695.81485267.261
3 600000.SH20190425 11.5611.6911.4811.5411.62-0.08-0.6885408761.29473973.527
4 600000.SH20190424 11.7611.7711.5111.6211.70-0.08-0.6838382011.08444929.313
.tail() 查看后n行數(shù)據(jù),默認值是5
df.tail()
Out[2]:
ts_codetrade_dateopenhighlowclosepre_closechangepct_chgvolamount
16 600000.SH20190408 11.7911.9611.6511.7211.710.010.0854778703.73920513.531
17 600000.SH20190404 11.5511.7111.5411.7111.500.211.8261752325.27876099.547
18 600000.SH20190403 11.3711.5411.3411.5011.440.060.5245502710.29575799.446
19 600000.SH20190402 11.5011.5211.4111.4411.440.000.0000467147.10534896.810
20 600000.SH20190401 11.3611.5211.2911.4411.280.161.4184706374.05808657.530
.shape 查看數(shù)據(jù)維數(shù)
df.shape
Out[3]: (21, 11)
.columns 查看所有列名
df.columns
Out[4]:
Index([ts_code,trade_date,open,high,low,close,pre_close,
change,pct_chg,vol,amount],
dtype=object)
.info() 查看索引、數(shù)據(jù)類型和內(nèi)存信息
df.info()
RangeIndex:21entries,0to20
Data columns (total11columns):
ts_code21non-nullobject
trade_date21non-nullobject
open21non-nullfloat64
high21non-nullfloat64
low21non-nullfloat64
close21non-nullfloat64
pre_close21non-nullfloat64
change21non-nullfloat64
pct_chg21non-nullfloat64
vol21non-nullfloat64
amount21non-nullfloat64
dtypes: float64(9),object(2)
memory usage:1.9 KB
.describe() 查看每列數(shù)據(jù)的基本統(tǒng)計值,包括計數(shù)值、均值、標準差、最小最大值、1/4、1/2、3/4分位數(shù)。
df.describe()
Out[7]:
openhighlowclosepre_closechangepct_chgvolamount
count21.00000021.00000021.00000021.00000021.00000021.00000021.0000002.100000e 01 2.100000e 01
mean11.63047611.77761911.52428611.63714311.6042860.0328570.2962525.734931e 05 6.704836e 05
std0.2153480.2289300.1848400.2075120.2067990.1932131.6710992.333355e 05 2.792896e 05
min11.35000011.52000011.28000011.32000011.280000-0.300000-2.4979002.627369e 05 3.017520e 05
25% 11.47000011.56000011.41000011.48000011.470000-0.060000-0.5199004.102754e 05 4.739735e 05
50% 11.56000011.75000011.48000011.54000011.5400000.0000000.0000005.027103e 05 5.757994e 05
75% 11.76000011.99000011.65000011.72000011.7100000.1000000.8396007.050917e 05 8.161270e 05
max12.02000012.20000011.88000012.01000012.0100000.4900004.2683001.234747e 06 1.466715e 06
.value_counts() 查看Series對象的唯一值和計數(shù)值
df[close].value_counts(dropna=False)
Out[8]:
11.482
11.472
11.712
11.542
11.912
11.442
11.721
11.951
11.701
11.321
11.491
12.011
11.621
11.501
11.971
Name:close, dtype:int64
如果上面這些操作還不夠直觀的話,就作圖看看,需要先導(dǎo)入Python可視化庫matplotlib, 為了規(guī)范代碼書寫,統(tǒng)一寫在了最前面。
① 直方圖
df[close].plot(kind=hist, rot=0)
plt.show()

② 箱型圖
df.boxplot(column=close,by=ts_code, rot=0)
plt.show()

③ 散點圖
df.plot(kind=scatter, x=close, y=pre_close, rot=0)
plt.show()

二、清洗數(shù)據(jù)
了解數(shù)據(jù)集之后,我們就可以開始對數(shù)據(jù)集進行清洗了,前面提到通常要處理的問題有包含無效信息,列名不規(guī)范、格式不一致,存在重復(fù)值,缺失值,異常值等,下面我們一個一個來看。
01
去除不需要的行、列
在分析一個數(shù)據(jù)集的時候,很多信息其實是用不到的,因此,需要去除不必要的行或列。這里以csv文件為例,在導(dǎo)入的時候就可以通過設(shè)置pd.read_csv()里面的參數(shù)來實現(xiàn)這個目的。
先來感受一下官方文檔中給出的詳細解釋,里面的參數(shù)是相當?shù)亩啵疚闹唤榻B比較常用的幾個,感興趣的話,可以好好研究一下文檔,這些參數(shù)還是非常好用的,能省去很多導(dǎo)入后整理的工作。

【header】默認header=0,即將文件中的0行作為列名和數(shù)據(jù)的開頭,但有時候0行的數(shù)據(jù)是無關(guān)的,我們想跳過0行,讓1行作為數(shù)據(jù)的開頭,可以通過將header設(shè)置為1來實現(xiàn)。
【usecols】根據(jù)列的位置或名字,如[0,1,2]或[‘a(chǎn)’, ‘b’, ‘c’],選出特定的列。
【nrows】要導(dǎo)入的數(shù)據(jù)行數(shù),在數(shù)據(jù)量很大、但只想導(dǎo)入其中一部分時使用。
獲取數(shù)據(jù):
從NYC OpenData網(wǎng)站下載csv格式原始數(shù)據(jù)

數(shù)據(jù)樣本如下:

導(dǎo)入數(shù)據(jù),只選取前100行和特定幾列。
subset_columns= [Job #,Doc #,Borough,Initial Cost,Total Est. Fee]
df = pd.read_csv(文件路徑, nrows=100, usecols=subset_columns)
df.head()
Out[15]:
Job# Doc # Borough Initial Cost Total Est. Fee
04202917941QUEENS$2000.00$100.00
14202918011QUEENS$15000.00$151.50
23406441281BROOKLYN$44726.00$234.00
34216854391QUEENS$0.00$243.00
44216779742QUEENS$105000.00$1275.60
再看一下將header設(shè)置為1的效果,但這里其實不需要這么做,因為0行數(shù)據(jù)是有用的。
df= pd.read_csv(文件路徑, nrows=100, header=1)
df.head()
Out[15]:
04202917941QUEENS$2000.00$100.00
14202918011QUEENS$15000.00$151.50
23406441281BROOKLYN$44726.00$234.00
34216854391QUEENS$0.00$243.00
44216779742QUEENS$105000.00$1275.60
如果在數(shù)據(jù)導(dǎo)入之后,還想刪除某些行和列,可以用 .drop() 方法。
先創(chuàng)建一個列表list,把不需要的列名放進去,再調(diào)用.drop() 方法,參數(shù)axis為1時代表列,為0時代表行,參數(shù)inplace=True表示不創(chuàng)建新的對象,直接對原始對象進行修改。這里我們刪除前兩列。
to_drop= [Job #,Doc #]
df.drop(to_drop, axis=1, inplace=True)
df.head()
Out[22]:
Borough Initial Cost Total Est. Fee
0QUEENS$2000.00$100.00
1QUEENS$15000.00$151.50
2BROOKLYN$44726.00$234.00
3QUEENS$0.00$243.00
4QUEENS$105000.00$1275.60
02
重新命名列
當原始數(shù)據(jù)的列名不好理解,或者不夠簡潔時,可以用.rename()方法進行修改。這里我們把英文的列名改成中文,先創(chuàng)建一個字典,把要修改的列名定義好,然后調(diào)用rename()方法。
new_names = {Borough:區(qū),Initial Cost:初始成本,Total Est. Fee:總附加費用}
df.rename(columns=new_names, inplace=True)
df.head()
Out[23]:
區(qū) 初始成本 總附加費用
0 QUEENS$2000.00$100.00
1 QUEENS$15000.00$151.50
2 BROOKLYN$44726.00$234.00
3 QUEENS$0.00$243.00
4 QUEENS$105000.00$1275.60
03
重新設(shè)置索引
數(shù)據(jù)默認的索引是從0開始的有序整數(shù),但如果想把某一列設(shè)置為新的索引,可以用.set_index()方法實現(xiàn),在示例中我們把"區(qū)"這列設(shè)置為新索引。
df.set_index(區(qū), inplace=True)
df.head()
Out[24]:
初始成本 總附加費用
區(qū)
QUEENS$2000.00$100.00
QUEENS$15000.00$151.50
BROOKLYN$44726.00$234.00
QUEENS$0.00$243.00
QUEENS$105000.00$1275.60
04
用字符串操作規(guī)范列
字符串str操作是非常實用的,因為列中總是會包含不必要的字符,常用的方法如下:
lower()
upper()
capitalize()
replace()
strip()
split()
get()
contains()
find()
str.lower() 是把大寫轉(zhuǎn)換成小寫,同理,str.upper()是把小寫轉(zhuǎn)換成大寫,將示例中用大寫字母表示的索引轉(zhuǎn)換成小寫,效果如下:
df.index = df.index.str.lower()
df.head()
Out[25]:
初始成本 總附加費用
區(qū)
queens$2000.00$100.00
queens$15000.00$151.50
brooklyn$44726.00$234.00
queens$0.00$243.00
queens$105000.00$1275.60
str.capitalize() 設(shè)置首字母大寫
df.index = df.index.str.capitalize()
df.head()
Out[26]:
初始成本 總附加費用
區(qū)
Queens$2000.00$100.00
Queens$15000.00$151.50
Brooklyn$44726.00$234.00
Queens$0.00$243.00
Queens$105000.00$1275.60
str.replace($, ) 替換特定字符。這里把列中的美元符號$去掉,替換成空字符。
df[初始成本] = df[初始成本].str.replace($,)
df[總附加費用] = df[總附加費用].str.replace($,)
df.head()
Out[27]:
初始成本 總附加費用
區(qū)
Queens2000.00100.00
Queens15000.00151.50
Brooklyn44726.00234.00
Queens0.00243.00
Queens105000.001275.60
str.strip() 去除字符串中的頭尾空格、以及
df[初始成本] = df[初始成本]
df[初始成本][0]
Out[28]: 2000.00
df[初始成本] = df[初始成本].str.strip()
df[初始成本][0]
Out[29]: 2000.00
str.split(x) 使用字符串中的x字符作為分隔符,將字符串分隔成列表。這里將列中的值以.進行分割,效果如下:
df[總附加費用] = df[總附加費用].str.split(.)
df.head()
Out[30]:
初始成本 總附加費用
區(qū)
Queens2000.00[100,00]
Queens15000.00[151,50]
Brooklyn44726.00[234,00]
Queens0.00[243,00]
Queens105000.00[1275,60]
str.get() 選取列表中某個位置的值。接著上面分割后的結(jié)果,我們用str.get(0)取出列表中前一個位置的數(shù)值,生成新的一列“總附加費用_整數(shù)”,即取出金額中的整數(shù)部分。
df[總附加費用_整數(shù)] = df[總附加費用].str.get(0)
df.head()
Out[31]:
初始成本 總附加費用 總附加費用_整數(shù)
區(qū)
Queens2000.00[100,00]100
Queens15000.00[151,50]151
Brooklyn44726.00[234,00]234
Queens0.00[243,00]243
Queens105000.00[1275,60]1275
str.contains() 判斷是否存在某個字符,返回的是布爾值。這里判斷一下"總附加費用_整數(shù)"列中是否包含字符0。
df[總附加費用_整數(shù)].str.contains(0)
Out[33]:
區(qū)
QueensTrue
QueensFalse
BrooklynFalse
QueensFalse
QueensFalse
str.find()檢測字符串中是否包含子字符串str,如果是,則返回該子字符串開始位置的索引值。示例中的0字符最開始出現(xiàn)的位置是1。
df[總附加費用_整數(shù)][0]
Out[13]: 100
df[總附加費用_整數(shù)][0].find(0)
Out[14]: 1
學完基本的字符串操作方法,我們來看一下如何結(jié)合NumPy來提高字符串操作的效率。
獲取數(shù)據(jù),這里我們用一個新的數(shù)據(jù)集,下載鏈接如下,里面包含兩個csv文件和一個txt文件:
https://github.com/realpython/python-data-cleaning
① BL-Flickr-Images-Book.csv
② olympics.csv
③ university_towns.txt
導(dǎo)入csv文件①,先觀察一下"Place of Publication"這一列。
df = pd.read_csv(文件路徑)
df[Place of Publication].head(10)
Out[38]:
0London
1London; Virtue & Yorston
2London
3London
4London
5London
6London
7pp.40. G. Bryan & Co: Oxford,1898
8London]
9London
Name: PlaceofPublication, dtype:object
我們發(fā)現(xiàn),這一列中的格式并不統(tǒng)一,比如1行中的London; Virtue & Yorston,London后面的部分我們不需要,還有7行的pp. 40. G. Bryan & Co: Oxford, 1898,有效信息只是Oxford。
再用.tail(10)方法觀察這一列的最后十行:
df[Place of Publication].tail(10)
Out[39]:
8277New York
8278London
8279New York
8280London
8281Newcastle-upon-Tyne
8282London
8283Derby
8284London
8285Newcastle upon Tyne
8286London
Name: PlaceofPublication, dtype:object
我們發(fā)現(xiàn),8281行的Newcastle-upon-Tyne中間有連字符,但8285行卻沒有,這些都是要解決的格式不規(guī)范的問題。
為了清洗這一列,我們可以將Pandas中的.str()方法與NumPy的np.where函數(shù)相結(jié)合,np.where函數(shù)是Excel的IF()宏的矢量化形式,它的語法如下:
>>> np.where(condition,then,else)
如果condition條件為真,則執(zhí)行then,否則執(zhí)行else。這里的condition條件可以是一個類數(shù)組的對象,也可以是一個布爾表達式,我們也可以利用np.where函數(shù)嵌套多個條件進行矢量化計算和判斷。
>>> np.where(condition1, x1,
np.where(condition2, x2,
np.where(condition3, x3, ...)))
下面的這個實例,就是同時嵌套兩個條件解決上面提到的那兩個字符串問題。思路是,如果字符串里面包含London,就用London代替,這樣可以去除其他冗余信息,否則,如果字符串里面包含Oxford,則用Oxford代替,同時如果字符串里面包含符號-,則用空格代替。
pub = df[Place of Publication]
london = pub.str.contains(London)
oxford = pub.str.contains(Oxford)
df[Place of Publication] = np.where(london,London,
np.where(oxford,Oxford,
pub.str.replace(-, )))
打印出前十行和后十行,結(jié)果如下,可以和整理前的數(shù)據(jù)進行對比。
df[Place of Publication].head(10)
Out[42]:
0London
1London
2London
3London
4London
5London
6London
7Oxford
8London
9London
Name: PlaceofPublication, dtype:object
df[Place of Publication].tail(10)
Out[43]:
8277New York
8278London
8279New York
8280London
8281Newcastle upon Tyne
8282London
8283Derby
8284London
8285Newcastle upon Tyne
8286London
Name: PlaceofPublication, dtype:object
05
用函數(shù)規(guī)范列
在某些情況下,數(shù)據(jù)不規(guī)范的情況并不局限于某一列,而是更廣泛地分布在整個表格中。因此,自定義函數(shù)并應(yīng)用于整個表格中的每個元素會更加高效。用applymap()方法可以實現(xiàn)這個功能,它類似于內(nèi)置的map()函數(shù),只不過它是將函數(shù)應(yīng)用于整個表格中的所有元素。
我們打開文件txt文件③,先觀察一下數(shù)據(jù):
$ head Datasets/univerisity_towns.txt
Alabama[edit]
Auburn (Auburn University)[1]
Florence (University of North Alabama)
Jacksonville (Jacksonville State University)[2]
Livingston (University of West Alabama)[2]
Montevallo (University of Montevallo)[2]
Troy (Troy University)[2]
Tuscaloosa (University of Alabama, Stillman College, Shelton State)[3][4]
Tuskegee (Tuskegee University)[5]
Alaska[edit]
觀察發(fā)現(xiàn),數(shù)據(jù)格式有如下特點:
州A[edit]
城市A(大學)
城市B(大學)
州B[edit]
城市A(大學)
城市B(大學)
......
我們可以利用這一數(shù)據(jù)格式,創(chuàng)建一個(州、市)元組列表,并將該列表轉(zhuǎn)化成一個DataFrame。先創(chuàng)建一個列表,列表中包含州和城市(大學)信息。
university_towns = []
withopen(D:/code/tushare interpret and tech team/python-data-cleaning-master/Datasets/university_towns.txt)asfile:
forlineinfile:
if[edit]inline:# 該行有[edit]
state = line# 將改行信息賦值給“州”,記住這個“州”,直到找到下一個為止
else:
university_towns.append((state, line))# 否則,改行為城市信息,并且它們都屬于上面的“州”
university_towns[:5]
Out[44]:
[(Alabama[edit] ,Auburn (Auburn University)[1] ),
(Alabama[edit] ,Florence (University of North Alabama) ),
(Alabama[edit] ,Jacksonville (Jacksonville State University)[2] ),
(Alabama[edit] ,Livingston (University of West Alabama)[2] ),
(Alabama[edit] ,Montevallo (University of Montevallo)[2] )]
用pd.DataFrame()方法將這個列表轉(zhuǎn)換成一個DataFrame,并將列設(shè)置為"State"和"RegionName"。Pandas將接受列表中的每個元素,并將元組左邊的值傳入"State"列,右邊的值傳入"RegionName"列。
towns_df = pd.DataFrame(university_towns, columns=[State,RegionName])
towns_df.head()
Out[45]:
State RegionName
0Alabama[edit] Auburn (Auburn University)[1]
1Alabama[edit] Florence (UniversityofNorth Alabama)
2Alabama[edit] Jacksonville (Jacksonville State University)[2]
3Alabama[edit] Livingston (UniversityofWest Alabama)[2]
4Alabama[edit] Montevallo (UniversityofMontevallo)[2]
接下來就要對列中的字符串進行整理,"State"列中的有效信息是州名,"RegionName"列中的有效信息是城市名,其他的字符都可以刪掉。當然,除了用之前提到的利用循環(huán)和.str()方法相結(jié)合的方式進行操作,我們還可以選擇用applymap()方法,它會將傳入的函數(shù)作用于整個DataFrame所有行列中的每個元素。
先定義函數(shù)get_citystate(item),功能是只提取元素中的有效信息。
defget_citystate(item):
if (initem:
returnitem[:item.find( ()]
elif[initem:
returnitem[:item.find([)]
else:
returnitem
然后,我們將這個函數(shù)傳入applymap(),并應(yīng)用于towns_df,結(jié)果如下:
towns_df = towns_df.applymap(get_citystate)
towns_df.head()
Out[48]:
State RegionName
0 Alabama Auburn
1 Alabama Florence
2 Alabama Jacksonville
3 Alabama Livingston
4 Alabama Montevallo
現(xiàn)在towns_df表格看起來是不是干凈多了!
06
刪除重復(fù)數(shù)據(jù)
重復(fù)數(shù)據(jù)會消耗不必要的內(nèi)存,在處理數(shù)據(jù)時執(zhí)行不必要的計算,還會使分析結(jié)果出現(xiàn)偏差。因此,我們有必要學習如何刪除重復(fù)數(shù)據(jù)。
先看一個來自DataCamp的數(shù)據(jù)集,調(diào)用info()方法打印出每列數(shù)據(jù)的具體信息和內(nèi)存信息,共有24092行數(shù)據(jù),內(nèi)存占用量是753.0 KB。
tracks = billboard[[year,artist,track,time]]
print(tracks.info())
RangeIndex:24092entries,0to24091
Data columns (total4columns):
year24092non-nullint64
artist24092non-nullobject
track24092non-nullobject
time24092non-nullobject
dtypes: int64(1),object(3)
memory usage:753.0 KB
None
下面調(diào)用.drop_duplicates()函數(shù)刪除重復(fù)數(shù)據(jù)。
In [11]: tracks_no_duplicates = tracks.drop_duplicates()
... print(tracks_no_duplicates.info())
...
Int64Index:317entries,0to316
Data columns (total4columns):
year317non-nullint64
artist317non-nullobject
track317non-nullobject
time317non-nullobject
dtypes: int64(1),object(3)
memory usage:12.4 KB
None
刪完之后我們發(fā)現(xiàn),數(shù)據(jù)量減少到了317個,內(nèi)存占用縮減至12.4 KB。
07
填充缺失值
數(shù)據(jù)集中經(jīng)常會存在缺失值,學會正確處理它們很重要,因為在計算的時候,有些無法處理缺失值,有些則在默認情況下跳過缺失值。而且,了解缺失的數(shù)據(jù),并思考用什么值來填充它們,對做出無偏的數(shù)據(jù)分析至關(guān)重要。
同樣是來自DataCamp的一個存在缺失值的數(shù)據(jù)集:
In[3]:airquality.head(10)
Out[3]:
OzoneSolar.RWindTempMonthDay
0 41.0190.07.467 5 1
1 36.0118.08.072 5 2
2 12.0149.012.674 5 3
3 18.0313.011.562 5 4
4NaNNaN14.356 5 5
5 28.0NaN14.966 5 6
6 23.0299.08.665 5 7
7 19.099.013.859 5 8
8 8.019.020.161 5 9
9NaN194.08.669 5 10
以"Ozone"列為例,我們可以調(diào)用fillna()函數(shù),用該列的均值.mean()填充NaN值。
oz_mean = airquality.Ozone.mean()
airquality[Ozone] = airquality[Ozone].fillna(oz_mean)
print(airquality.head(10))
Ozone Solar.R Wind Temp Month Day
041.000000190.07.46751
136.000000118.08.07252
212.000000149.012.67453
318.000000313.011.56254
443.195402NaN14.35655
528.000000NaN14.96656
623.000000299.08.66557
719.00000099.013.85958
88.00000019.020.16159
943.195402194.08.669510
如果你在學習Python的過程當中有遇見任何問題,可以加入我的python交流學習qq群:250933691,多多交流問題,互幫互助,群里有不錯的學習教程和開發(fā)工具。學習python有任何問題(學習方法,學習效率,如何就業(yè)),可以隨時來咨詢我
三、總結(jié)
了解如何進行數(shù)據(jù)清洗非常重要,因為它是數(shù)據(jù)科學的重要組成部分。好在Python提供了非常好用的Pandas和NumPy庫來幫助我們清理數(shù)據(jù)集,本文介紹的方法都是在實際中經(jīng)常會用到的,希望大家能牢記于心。
歡迎分享轉(zhuǎn)載→http://www.avcorse.com/read-232385.html
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖