Python數(shù)據(jù)清洗80%的工作量,看這篇就夠了

干凈整潔的數(shù)據(jù)是后續(xù)進行研究和分析的基礎顶掉。數(shù)據(jù)科學家們會花費大量的時間來清理數(shù)據(jù)集梗夸,毫不夸張地說羞迷,數(shù)據(jù)清洗會占據(jù)他們80%的工作時間减宣,而真正用來分析數(shù)據(jù)的時間只占到20%左右盐须。


所以,數(shù)據(jù)清洗到底是在清洗些什么漆腌?


通常來說贼邓,你所獲取到的原始數(shù)據(jù)不能直接用來分析,因為它們會有各種各樣的問題闷尿,如包含無效信息塑径,列名不規(guī)范、格式不一致填具,存在重復值统舀,缺失值,異常值等.....

如果你在學習Python的過程當中有遇見任何問題,可以加入我的python交流學習qq群:250933691誉简,多多交流問題碉就,互幫互助,群里有不錯的學習教程和開發(fā)工具闷串。學習python有任何問題(學習方法瓮钥,學習效率,如何就業(yè))窿克,可以隨時來咨詢我

本文會給大家介紹如何用Python中自帶的PandasNumPy庫進行數(shù)據(jù)清洗骏庸。在正式講解之前,先簡單介紹一下這兩個非常好用的庫年叮。


Pandas的名稱來自于Panel data和Python數(shù)據(jù)分析data analysis具被,是Python的一個數(shù)據(jù)分析包,最初由AQR Capital Management于2008年4月開發(fā)只损,被作為金融數(shù)據(jù)分析工具一姿,為時間序列分析提供了很好的支持,并于2009年底開源出來跃惫。


NumPyNumeric Python的縮寫叮叹,是Python的一種開源的數(shù)值計算擴展,可用來存儲和處理大型矩陣matrix爆存,比Python自身的嵌套列表結構要高效的多蛉顽,提供了許多高級的數(shù)值編程工具,如:矩陣數(shù)據(jù)類型先较、矢量處理携冤,以及精密的運算庫,專為進行嚴格的數(shù)字處理而產(chǎn)生闲勺。

目錄

一曾棕、了解數(shù)據(jù)

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

去除不需要的行菜循、列

重新命名列

重新設置索引

用字符串操作規(guī)范列

用函數(shù)規(guī)范列

刪除重復數(shù)據(jù)

填充缺失值

三翘地、總結

【注】為了清晰直觀地展示數(shù)據(jù)清洗操作,本文會用到幾個不同的數(shù)據(jù)集癌幕,重點是方法的講解衙耕。

【工具】Python 3

一、了解數(shù)據(jù)

拿到一個全新的數(shù)據(jù)集勺远,應該從哪里入手臭杰?

沒錯,我們需要先了解數(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ù)據(jù)的最大列數(shù)囊拜,防止出現(xiàn)省略號…,導致數(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

如果上面這些操作還不夠直觀的話,就作圖看看嗓化,需要先導入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ī)范驳糯、格式不一致,存在重復值伦仍,缺失值结窘,異常值等很洋,下面我們一個一個來看充蓝。

01

去除不需要的行、列

在分析一個數(shù)據(jù)集的時候喉磁,很多信息其實是用不到的谓苟,因此,需要去除不必要的行或列协怒。這里以csv文件為例涝焙,在導入的時候就可以通過設置pd.read_csv()里面的參數(shù)來實現(xiàn)這個目的。

先來感受一下官方文檔中給出的詳細解釋孕暇,里面的參數(shù)是相當?shù)亩嗦刈玻疚闹唤榻B比較常用的幾個赤兴,感興趣的話,可以好好研究一下文檔隧哮,這些參數(shù)還是非常好用的桶良,能省去很多導入后整理的工作。

header】默認header=0沮翔,即將文件中的0行作為列名和數(shù)據(jù)的開頭陨帆,但有時候0行的數(shù)據(jù)是無關的,我們想跳過0行采蚀,讓1行作為數(shù)據(jù)的開頭疲牵,可以通過將header設置為1來實現(xiàn)。

usecols】根據(jù)列的位置或名字榆鼠,如[0,1,2]或[‘a(chǎn)’, ‘b’, ‘c’]纲爸,選出特定的列。


nrows】要導入的數(shù)據(jù)行數(shù)璧眠,在數(shù)據(jù)量很大缩焦、但只想導入其中一部分時使用。

獲取數(shù)據(jù):

從NYC OpenData網(wǎng)站下載csv格式原始數(shù)據(jù)

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

導入數(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設置為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ù)導入之后,還想刪除某些行和列腰鬼,可以用?.drop()?方法嵌赠。

先創(chuàng)建一個列表list,把不需要的列名放進去熄赡,再調(diào)用.drop()?方法姜挺,參數(shù)axis1時代表列,為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ù)據(jù)默認的索引是從0開始的有序整數(shù)慧妄,但如果想把某一列設置為新的索引,可以用.set_index()方法實現(xiàn)剪芍,在示例中我們把"區(qū)"這列設置為新索引腰涧。

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()?是把大寫轉換成小寫窖铡,同理,str.upper()是把小寫轉換成大寫坊谁,將示例中用大寫字母表示的索引轉換成小寫费彼,效果如下:

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()?設置首字母大寫

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()?去除字符串中的頭尾空格、以及\n \t


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()?選取列表中某個位置的值小染。接著上面分割后的結果翘瓮,我們用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

學完基本的字符串操作方法伦籍,我們來看一下如何結合NumPy來提高字符串操作的效率蓝晒。

獲取數(shù)據(jù),這里我們用一個新的數(shù)據(jù)集鸽斟,下載鏈接如下拔创,里面包含兩個csv文件和一個txt文件:

https://github.com/realpython/python-data-cleaning

① BL-Flickr-Images-Book.csv

② olympics.csv

③?university_towns.txt

導入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ù)相結合材部,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('-','?')))

打印出前十行和后十行冰抢,結果如下,可以和整理前的數(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ù)并應用于整個表格中的每個元素會更加高效。用applymap()方法可以實現(xiàn)這個功能官撼,它類似于內(nèi)置的map()函數(shù)梧躺,只不過它是將函數(shù)應用于整個表格中的所有元素。

我們打開文件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)建一個(州、市)元組列表续搀,并將該列表轉化成一個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]\n','Auburn?(Auburn?University)[1]\n'),

('Alabama[edit]\n','Florence?(University?of?North?Alabama)\n'),

('Alabama[edit]\n','Jacksonville?(Jacksonville?State?University)[2]\n'),

('Alabama[edit]\n','Livingston?(University?of?West?Alabama)[2]\n'),

('Alabama[edit]\n','Montevallo?(University?of?Montevallo)[2]\n')]

pd.DataFrame()方法將這個列表轉換成一個DataFrame,并將列設置為"State"和"RegionName"霜大。Pandas將接受列表中的每個元素构哺,并將元組左邊的值傳入"State"列,右邊的值傳入"RegionName"列战坤。

towns_df?=?pd.DataFrame(university_towns,?columns=['State','RegionName'])

towns_df.head()

Out[45]:

State?????????????????????????????????????????RegionName

0Alabama[edit]\n????????????????????Auburn?(Auburn?University)[1]\n

1Alabama[edit]\n???????????Florence?(UniversityofNorth?Alabama)\n

2Alabama[edit]\n??Jacksonville?(Jacksonville?State?University)[2]\n

3Alabama[edit]\n???????Livingston?(UniversityofWest?Alabama)[2]\n

4Alabama[edit]\n?????????Montevallo?(UniversityofMontevallo)[2]\n

接下來就要對列中的字符串進行整理曙强,"State"列中的有效信息是州名,"RegionName"列中的有效信息是城市名途茫,其他的字符都可以刪掉碟嘴。當然,除了用之前提到的利用循環(huán)和.str()方法相結合的方式進行操作囊卜,我們還可以選擇用applymap()方法娜扇,它會將傳入的函數(shù)作用于整個DataFrame所有行列中的每個元素。

先定義函數(shù)get_citystate(item)栅组,功能是只提取元素中的有效信息雀瓢。

defget_citystate(item):

if'?('initem:

returnitem[:item.find('?(')]

elif'['initem:

returnitem[:item.find('[')]

else:

returnitem

然后,我們將這個函數(shù)傳入applymap()玉掸,并應用于towns_df刃麸,結果如下:

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

刪除重復數(shù)據(jù)

重復數(shù)據(jù)會消耗不必要的內(nèi)存司浪,在處理數(shù)據(jù)時執(zhí)行不必要的計算泊业,還會使分析結果出現(xiàn)偏差。因此啊易,我們有必要學習如何刪除重復數(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ù)刪除重復數(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ù)分析至關重要州袒。

同樣是來自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è)),可以隨時來咨詢我

三姐扮、總結

了解如何進行數(shù)據(jù)清洗非常重要絮供,因為它是數(shù)據(jù)科學的重要組成部分。好在Python提供了非常好用的PandasNumPy庫來幫助我們清理數(shù)據(jù)集茶敏,本文介紹的方法都是在實際中經(jīng)常會用到的杯缺,希望大家能牢記于心。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睡榆,一起剝皮案震驚了整個濱河市萍肆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胀屿,老刑警劉巖塘揣,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宿崭,居然都是意外死亡亲铡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奖蔓,“玉大人赞草,你說我怎么就攤上這事∵汉祝” “怎么了厨疙?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疑务。 經(jīng)常有香客問我沾凄,道長,這世上最難降的妖魔是什么知允? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任撒蟀,我火速辦了婚禮,結果婚禮上温鸽,老公的妹妹穿的比我還像新娘保屯。我一直安慰自己,他們只是感情好涤垫,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布配椭。 她就那樣靜靜地躺著,像睡著了一般雹姊。 火紅的嫁衣襯著肌膚如雪股缸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天吱雏,我揣著相機與錄音敦姻,去河邊找鬼。 笑死歧杏,一個胖子當著我的面吹牛镰惦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播犬绒,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼旺入,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凯力?” 一聲冷哼從身側響起茵瘾,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咐鹤,沒想到半個月后拗秘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡祈惶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年雕旨,在試婚紗的時候發(fā)現(xiàn)自己被綠了扮匠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡凡涩,死狀恐怖棒搜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情活箕,我是刑警寧澤力麸,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站讹蘑,受9級特大地震影響末盔,放射性物質(zhì)發(fā)生泄漏筑舅。R本人自食惡果不足惜座慰,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翠拣。 院中可真熱鬧版仔,春花似錦、人聲如沸误墓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谜慌。三九已至然想,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欣范,已是汗流浹背变泄。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恼琼,地道東北人妨蛹。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像晴竞,于是被迫代替她去往敵國和親蛙卤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容