业务范围
联系我们

地址:这里是您的公司地址

电话:0896-98589990

传真:0896-98589990

邮箱:

新闻资讯当前位置:官网首页 > 新闻资讯 >
这些方法解决了数据清洗 80% 的工作量

发布时间:2019-09-11

  

译者简介:北京第二外国语学院国际商务专业研一在读,目前在学习Python编程和量化投资相关知识。

作者:Real Python×DataCamp

干净整洁的数据是后续进行研究和分析的基础。数据科学家们会花费大量的时间来清理数据集,毫不夸张地说,数据清洗会占据他们80%的工作时间,而真正用来分析数据的时间只占到20%左右。

所以,数据清洗到底是在清洗些什么?

通常来说,你所获取到的原始数据不能直接用来分析,因为它们会有各种各样的问题,如包含无效信息,列名不规范、格式不一致,存在重复值,缺失值,异常值等.....

本文会给大家介绍如何用Python中自带的PandasNumPy库进行数据清洗。在正式讲解之前,先简单介绍一下这两个非常好用的库。

Pandas的名称来自于Panel data和Python数据分析data analysis,是Python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,被作为金融数据分析工具,为时间序列分析提供了很好的支持,并于2009年底开源出来。

NumPy是Numeric Python的缩写,是Python的一种开源的数值计算扩展,可用来存储和处理大型矩阵matrix,比Python自身的嵌套列表结构要高效的多,提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库,专为进行严格的数字处理而产生。

目录

一、了解数据

二、清洗数据

去除不需要的行、列

重新命名列

重新设置索引

用字符串操作规范列

用函数规范列

删除重复数据

填充缺失值

三、总结

【注】为了清晰直观地展示数据清洗操作,本文会用到几个不同的数据集,重点是方法的讲解。

【工具】Python 3

一、了解数据

拿到一个全新的数据集,应该从哪里入手?

没错,我们需要先了解数据,看看它长什么样子。这里用tushare.pro上面的日线行情数据进行展示,以浦发银行(600000.SH)为例。常用的方法和属性如下:

.head()

.tail()

.shape

.columns

.info()

.describe()

.value_counts()

首先,获取数据:

  1. importpandasaspd
  2. importnumpyasnp
  3. importmatplotlib.pyplotasplt
  4. importtushareasts
  5. pd.set_option('display.max_columns',100)#设置显示数据的最大列数,防止出现省略号…,导致数据显示不全
  6. pd.set_option('expand_frame_repr',False)#当列太多时不自动换行
  7. pro=ts.pro_api()
  8. df=pro.daily(ts_code='600000.SH',start_date='20190401',end_date='20190430')

.head()查看前n行数据,默认值是5

  1. df.head()
  2. Out[1]:
  3. ts_codetrade_dateopenhighlowclosepre_closechangepct_chgvolamount
  4. 0600000.SH2019043011.7012.0911.7011.9711.480.494.26831234747.381466714.710
  5. 1600000.SH2019042911.3511.5411.3411.4811.320.161.4134385869.38442046.727
  6. 2600000.SH2019042611.4311.5611.2811.3211.54-0.22-1.9064424695.81485267.261
  7. 3600000.SH2019042511.5611.6911.4811.5411.62-0.08-0.6885408761.29473973.527
  8. 4600000.SH2019042411.7611.7711.5111.6211.70-0.08-0.6838382011.08444929.313

.tail()查看后n行数据,默认值是5

  1. df.tail()
  2. Out[2]:
  3. ts_codetrade_dateopenhighlowclosepre_closechangepct_chgvolamount
  4. 16600000.SH2019040811.7911.9611.6511.7211.710.010.0854778703.73920513.531
  5. 17600000.SH2019040411.5511.7111.5411.7111.500.211.8261752325.27876099.547
  6. 18600000.SH2019040311.3711.5411.3411.5011.440.060.5245502710.29575799.446
  7. 19600000.SH2019040211.5011.5211.4111.4411.440.000.0000467147.10534896.810
  8. 20600000.SH2019040111.3611.5211.2911.4411.280.161.4184706374.05808657.530

.shape查看数据维数

  1. df.shape
  2. Out[3]:(21,11)

.columns查看所有列名

  1. df.columns
  2. Out[4]:
  3. Index(['ts_code','trade_date','open','high','low','close','pre_close',
  4. 'change','pct_chg','vol','amount'],
  5. dtype='object')

.info()查看索引、数据类型和内存信息

  1. df.info()
  2. <class'pandas.core.frame.DataFrame'>
  3. RangeIndex:21entries,0to20
  4. Datacolumns(total11columns):
  5. ts_code21non-nullobject
  6. trade_date21non-nullobject
  7. open21non-nullfloat64
  8. high21non-nullfloat64
  9. low21non-nullfloat64
  10. close21non-nullfloat64
  11. pre_close21non-nullfloat64
  12. change21non-nullfloat64
  13. pct_chg21non-nullfloat64
  14. vol21non-nullfloat64
  15. amount21non-nullfloat64
  16. dtypes:float64(9),object(2)
  17. memoryusage:1.9+KB

.describe()查看每列数据的基本统计值,包括计数值、均值、标准差、最小最大值、1/4、1/2、3/4分位数。

  1. df.describe()
  2. Out[7]:
  3. openhighlowclosepre_closechangepct_chgvolamount
  4. count21.00000021.00000021.00000021.00000021.00000021.00000021.0000002.100000e+012.100000e+01
  5. mean11.63047611.77761911.52428611.63714311.6042860.0328570.2962525.734931e+056.704836e+05
  6. std0.2153480.2289300.1848400.2075120.2067990.1932131.6710992.333355e+052.792896e+05
  7. min11.35000011.52000011.28000011.32000011.280000-0.300000-2.4979002.627369e+053.017520e+05
  8. 25%11.47000011.56000011.41000011.48000011.470000-0.060000-0.5199004.102754e+054.739735e+05
  9. 50%11.56000011.75000011.48000011.54000011.5400000.0000000.0000005.027103e+055.757994e+05
  10. 75%11.76000011.99000011.65000011.72000011.7100000.1000000.8396007.050917e+058.161270e+05
  11. max12.02000012.20000011.88000012.01000012.0100000.4900004.2683001.234747e+061.466715e+06

.value_counts()查看Series对象的唯一值和计数值

  1. df['close'].value_counts(dropna=False)
  2. Out[8]:
  3. 11.482
  4. 11.472
  5. 11.712
  6. 11.542
  7. 11.912
  8. 11.442
  9. 11.721
  10. 11.951
  11. 11.701
  12. 11.321
  13. 11.491
  14. 12.011
  15. 11.621
  16. 11.501
  17. 11.971
  18. Name:close,dtype:int64

如果上面这些操作还不够直观的话,就作图看看,需要先导入Python可视化库matplotlib, 为了规范代码书写,统一写在了最前面。

① 直方图

  1. df['close'].plot(kind='hist',rot=0)
  2. plt.show()

② 箱型图

  1. df.boxplot(column='close',by='ts_code',rot=0)
  2. plt.show()

散点图

  1. df.plot(kind='scatter',x='close',y='pre_close',rot=0)
  2. plt.show()

二、清洗数据

了解数据集之后,我们就可以开始对数据集进行清洗了,前面提到通常要处理的问题有包含无效信息,列名不规范、格式不一致,存在重复值,缺失值,异常值等,下面我们一个一个来看。

01

去除不需要的行、列

在分析一个数据集的时候,很多信息其实是用不到的,因此,需要去除不必要的行或列。这里以csv文件为例,在导入的时候就可以通过设置pd.read_csv()里面的参数来实现这个目的。

先来感受一下官方文档中给出的详细解释,里面的参数是相当的多,本文只介绍比较常用的几个,感兴趣的话,可以好好研究一下文档,这些参数还是非常好用的,能省去很多导入后整理的工作。

header】默认header=0,即将文件中的0行作为列名和数据的开头,但有时候0行的数据是无关的,我们想跳过0行,让1行作为数据的开头,可以通过将header设置为1来实现。

usecols】根据列的位置或名字,如[0,1,2]或[‘a’, ‘b’, ‘c’],选出特定的列。

nrows】要导入的数据行数,在数据量很大、但只想导入其中一部分时使用。

获取数据:

从NYC OpenData网站下载csv格式原始数据

数据样本如下:

导入数据,只选取前100行和特定几列。

  1. subset_columns=['Job#','Doc#','Borough','InitialCost','TotalEst.Fee']
  2. df=pd.read_csv('文件路径',nrows=100,usecols=subset_columns)
  3. df.head()
  4. Out[15]:
  5. Job#Doc#BoroughInitialCostTotalEst.Fee
  6. 04202917941QUEENS$2000.00$100.00
  7. 14202918011QUEENS$15000.00$151.50
  8. 23406441281BROOKLYN$44726.00$234.00
  9. 34216854391QUEENS$0.00$243.00
  10. 44216779742QUEENS$105000.00$1275.60

再看一下将header设置为1的效果,但这里其实不需要这么做,因为0行数据是有用的。

  1. df=pd.read_csv('文件路径',nrows=100,header=1)
  2. df.head()
  3. Out[15]:
  4. 04202917941QUEENS$2000.00$100.00
  5. 14202918011QUEENS$15000.00$151.50
  6. 23406441281BROOKLYN$44726.00$234.00
  7. 34216854391QUEENS$0.00$243.00
  8. 44216779742QUEENS$105000.00$1275.60

如果在数据导入之后,还想删除某些行和列,可以用.drop()方法。

先创建一个列表list,把不需要的列名放进去,再调用.drop()方法,参数axis1时代表列,为0时代表行,参数inplace=True表示不创建新的对象,直接对原始对象进行修改。这里我们删除前两列。

  1. to_drop=['Job#','Doc#']
  2. df.drop(to_drop,axis=1,inplace=True)
  3. df.head()
  4. Out[22]:
  5. BoroughInitialCostTotalEst.Fee
  6. 0QUEENS$2000.00$100.00
  7. 1QUEENS$15000.00$151.50
  8. 2BROOKLYN$44726.00$234.00
  9. 3QUEENS$0.00$243.00
  10. 4QUEENS$105000.00$1275.60

02

重新命名列

当原始数据的列名不好理解,或者不够简洁时,可以用.rename()方法进行修改。这里我们把英文的列名改成中文,先创建一个字典,把要修改的列名定义好,然后调用rename()方法。

  1. new_names={'Borough':'区','InitialCost':'初始成本','TotalEst.Fee':'总附加费用'}
  2. df.rename(columns=new_names,inplace=True)
  3. df.head()
  4. Out[23]:
  5. 区初始成本总附加费用
  6. 0QUEENS$2000.00$100.00
  7. 1QUEENS$15000.00$151.50
  8. 2BROOKLYN$44726.00$234.00
  9. 3QUEENS$0.00$243.00
  10. 4QUEENS$105000.00$1275.60

03

重新设置索引

数据默认的索引是从0开始的有序整数,但如果想把某一列设置为新的索引,可以用.set_index()方法实现,在示例中我们把"区"这列设置为新索引。

  1. df.set_index('区',inplace=True)
  2. df.head()
  3. Out[24]:
  4. 初始成本总附加费用
  5. QUEENS$2000.00$100.00
  6. QUEENS$15000.00$151.50
  7. BROOKLYN$44726.00$234.00
  8. QUEENS$0.00$243.00
  9. QUEENS$105000.00$1275.60

04

用字符串操作规范列

字符串str操作是非常实用的,因为列中总是会包含不必要的字符,常用的方法如下:

lower()

upper()

capitalize()

replace()

strip()

split()

get()

contains()

find()

str.lower()是把大写转换成小写,同理,str.upper()是把小写转换成大写,将示例中用大写字母表示的索引转换成小写,效果如下:

  1. df.index=df.index.str.lower()
  2. df.head()
  3. Out[25]:
  4. 初始成本总附加费用
  5. queens$2000.00$100.00
  6. queens$15000.00$151.50
  7. brooklyn$44726.00$234.00
  8. queens$0.00$243.00
  9. queens$105000.00$1275.60

str.capitalize()设置首字母大写

  1. df.index=df.index.str.capitalize()
  2. df.head()
  3. Out[26]:
  4. 初始成本总附加费用
  5. Queens$2000.00$100.00
  6. Queens$15000.00$151.50
  7. Brooklyn$44726.00$234.00
  8. Queens$0.00$243.00
  9. Queens$105000.00$1275.60

str.replace('$', '')替换特定字符。这里把列中的美元符号$去掉,替换成空字符。

  1. df['初始成本']=df['初始成本'].str.replace('$','')
  2. df['总附加费用']=df['总附加费用'].str.replace('$','')
  3. df.head()
  4. Out[27]:
  5. 初始成本总附加费用
  6. Queens2000.00100.00
  7. Queens15000.00151.50
  8. Brooklyn44726.00234.00
  9. Queens0.00243.00
  10. Queens105000.001275.60

str.strip()去除字符串中的头尾空格、以及

  1. df['初始成本']=''+df['初始成本']
  2. df['初始成本'][0]
  3. Out[28]:'2000.00'
  4. df['初始成本']=df['初始成本'].str.strip()
  5. df['初始成本'][0]
  6. Out[29]:'2000.00'

str.split('x')使用字符串中的'x'字符作为分隔符,将字符串分隔成列表。这里将列中的值以'.'进行分割,效果如下:

  1. df['总附加费用']=df['总附加费用'].str.split('.')
  2. df.head()
  3. Out[30]:
  4. 初始成本总附加费用
  5. Queens2000.00[100,00]
  6. Queens15000.00[151,50]
  7. Brooklyn44726.00[234,00]
  8. Queens0.00[243,00]
  9. Queens105000.00[1275,60]

str.get()选取列表中某个位置的值。接着上面分割后的结果,我们用str.get(0)取出列表中前一个位置的数值,生成新的一列“总附加费用_整数”,即取出金额中的整数部分。

  1. df['总附加费用_整数']=df['总附加费用'].str.get(0)
  2. df.head()
  3. Out[31]:
  4. 初始成本总附加费用总附加费用_整数
  5. Queens2000.00[100,00]100
  6. Queens15000.00[151,50]151
  7. Brooklyn44726.00[234,00]234
  8. Queens0.00[243,00]243
  9. Queens105000.00[1275,60]1275

str.contains()判断是否存在某个字符,返回的是布尔值。这里判断一下"总附加费用_整数"列中是否包含字符'0'。

  1. df['总附加费用_整数'].str.contains('0')
  2. Out[33]:
  3. QueensTrue
  4. QueensFalse
  5. BrooklynFalse
  6. QueensFalse
  7. QueensFalse

str.find()检测字符串中是否包含子字符串str,如果是,则返回该子字符串开始位置的索引值。示例中的'0'字符最开始出现的位置是1。

  1. df['总附加费用_整数'][0]
  2. Out[13]:'100'
  3. df['总附加费用_整数'][0].find('0')
  4. Out[14]:1

学完基本的字符串操作方法,我们来看一下如何结合NumPy来提高字符串操作的效率。

获取数据,这里我们用一个新的数据集,下载链接如下,里面包含两个csv文件和一个txt文件:

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

① BL-Flickr-Images-Book.csv

② olympics.csv

③university_towns.txt

导入csv文件①,先观察一下"Place of Publication"这一列。

  1. df=pd.read_csv('文件路径')
  2. df['PlaceofPublication'].head(10)
  3. Out[38]:
  4. 0London
  5. 1London;Virtue&Yorston
  6. 2London
  7. 3London
  8. 4London
  9. 5London
  10. 6London
  11. 7pp.40.G.Bryan&Co:Oxford,1898
  12. 8London]
  13. 9London
  14. Name:PlaceofPublication,dtype:object

我们发现,这一列中的格式并不统一,比如1行中的London; Virtue & Yorston,London后面的部分我们不需要,还有7行的pp. 40. G. Bryan & Co: Oxford, 1898,有效信息只是Oxford。

再用.tail(10)方法观察这一列的最后十行:

  1. df['PlaceofPublication'].tail(10)
  2. Out[39]:
  3. 8277NewYork
  4. 8278London
  5. 8279NewYork
  6. 8280London
  7. 8281Newcastle-upon-Tyne
  8. 8282London
  9. 8283Derby
  10. 8284London
  11. 8285NewcastleuponTyne
  12. 8286London
  13. Name:PlaceofPublication,dtype:object

我们发现,8281行的Newcastle-upon-Tyne中间有连字符,但8285行却没有,这些都是要解决的格式不规范的问题。

为了清洗这一列,我们可以将Pandas中的.str()方法与NumPy的np.where函数相结合,np.where函数是Excel的IF()宏的矢量化形式,它的语法如下:

  1. >>>np.where(condition,then,else)

如果condition条件为真,则执行then,否则执行else。这里的condition条件可以是一个类数组的对象,也可以是一个布尔表达式,我们也可以利用np.where函数嵌套多个条件进行矢量化计算和判断。

  1. >>>np.where(condition1,x1,
  2. np.where(condition2,x2,
  3. np.where(condition3,x3,...)))

下面的这个实例,就是同时嵌套两个条件解决上面提到的那两个字符串问题。思路是,如果字符串里面包含'London',就用'London'代替,这样可以去除其他冗余信息,否则,如果字符串里面包含'Oxford',则用'Oxford'代替,同时如果字符串里面包含符号'-',则用空格代替。

  1. pub=df['PlaceofPublication']
  2. london=pub.str.contains('London')
  3. oxford=pub.str.contains('Oxford')
  4. df['PlaceofPublication']=np.where(london,'London',
  5. np.where(oxford,'Oxford',
  6. pub.str.replace('-','')))

打印出前十行和后十行,结果如下,可以和整理前的数据进行对比。

  1. df['PlaceofPublication'].head(10)
  2. Out[42]:
  3. 0London
  4. 1London
  5. 2London
  6. 3London
  7. 4London
  8. 5London
  9. 6London
  10. 7Oxford
  11. 8London
  12. 9London
  13. Name:PlaceofPublication,dtype:object

  1. df['PlaceofPublication'].tail(10)
  2. Out[43]:
  3. 8277NewYork
  4. 8278London
  5. 8279NewYork
  6. 8280London
  7. 8281NewcastleuponTyne
  8. 8282London
  9. 8283Derby
  10. 8284London
  11. 8285NewcastleuponTyne
  12. 8286London
  13. Name:PlaceofPublication,dtype:object

05

用函数规范列

在某些情况下,数据不规范的情况并不局限于某一列,而是更广泛地分布在整个表格中。因此,自定义函数并应用于整个表格中的每个元素会更加高效。用applymap()方法可以实现这个功能,它类似于内置的map()函数,只不过它是将函数应用于整个表格中的所有元素。

我们打开文件txt文件③,先观察一下数据:

  1. $headDatasets/univerisity_towns.txt
  2. Alabama[edit]
  3. Auburn(AuburnUniversity)[1]
  4. Florence(UniversityofNorthAlabama)
  5. Jacksonville(JacksonvilleStateUniversity)[2]
  6. Livingston(UniversityofWestAlabama)[2]
  7. Montevallo(UniversityofMontevallo)[2]
  8. Troy(TroyUniversity)[2]
  9. Tuscaloosa(UniversityofAlabama,StillmanCollege,SheltonState)[3][4]
  10. Tuskegee(TuskegeeUniversity)[5]
  11. Alaska[edit]

观察发现,数据格式有如下特点:

州A[edit]

城市A(大学)

城市B(大学)

州B[edit]

城市A(大学)

城市B(大学)

......

我们可以利用这一数据格式,创建一个(州、市)元组列表,并将该列表转化成一个DataFrame。先创建一个列表,列表中包含州和城市(大学)信息。

  1. university_towns=[]
  2. withopen('D:/code/tushareinterpretandtechteam/python-data-cleaning-master/Datasets/university_towns.txt')asfile:
  3. forlineinfile:
  4. if'[edit]'inline:#该行有[edit]
  5. state=line#将改行信息赋值给“州”,记住这个“州”,直到找到下一个为止
  6. else:
  7. university_towns.append((state,line))#否则,改行为城市信息,并且它们都属于上面的“州”
  8. university_towns[:5]
  9. Out[44]:
  10. [('Alabama[edit] ','Auburn(AuburnUniversity)[1] '),
  11. ('Alabama[edit] ','Florence(UniversityofNorthAlabama) '),
  12. ('Alabama[edit] ','Jacksonville(JacksonvilleStateUniversity)[2] '),
  13. ('Alabama[edit] ','Livingston(UniversityofWestAlabama)[2] '),
  14. ('Alabama[edit] ','Montevallo(UniversityofMontevallo)[2] ')]

pd.DataFrame()方法将这个列表转换成一个DataFrame,并将列设置为"State"和"RegionName"。Pandas将接受列表中的每个元素,并将元组左边的值传入"State"列,右边的值传入"RegionName"列。

  1. towns_df=pd.DataFrame(university_towns,columns=['State','RegionName'])
  2. towns_df.head()
  3. Out[45]:
  4. StateRegionName
  5. 0Alabama[edit] Auburn(AuburnUniversity)[1]
  6. 1Alabama[edit] Florence(UniversityofNorthAlabama)
  7. 2Alabama[edit] Jacksonville(JacksonvilleStateUniversity)[2]
  8. 3Alabama[edit] Livingston(UniversityofWestAlabama)[2]
  9. 4Alabama[edit] Montevallo(UniversityofMontevallo)[2]

接下来就要对列中的字符串进行整理,"State"列中的有效信息是州名,"RegionName"列中的有效信息是城市名,其他的字符都可以删掉。当然,除了用之前提到的利用循环和.str()方法相结合的方式进行操作,我们还可以选择用applymap()方法,它会将传入的函数作用于整个DataFrame所有行列中的每个元素。

先定义函数get_citystate(item),功能是只提取元素中的有效信息。

  1. defget_citystate(item):
  2. if'('initem:
  3. returnitem[:item.find('(')]
  4. elif'['initem:
  5. returnitem[:item.find('[')]
  6. else:
  7. returnitem

然后,我们将这个函数传入applymap(),并应用于towns_df,结果如下:

  1. towns_df=towns_df.applymap(get_citystate)
  2. towns_df.head()
  3. Out[48]:
  4. StateRegionName
  5. 0AlabamaAuburn
  6. 1AlabamaFlorence
  7. 2AlabamaJacksonville
  8. 3AlabamaLivingston
  9. 4AlabamaMontevallo

现在towns_df表格看起来是不是干净多了!

06

删除重复数据

重复数据会消耗不必要的内存,在处理数据时执行不必要的计算,还会使分析结果出现偏差。因此,我们有必要学习如何删除重复数据。

先看一个来自DataCamp的数据集,调用info()方法打印出每列数据的具体信息和内存信息,共有24092行数据,内存占用量是753.0+KB。

  1. tracks=billboard[['year','artist','track','time']]
  2. print(tracks.info())
  3. <class'pandas.core.frame.DataFrame'>
  4. RangeIndex:24092entries,0to24091
  5. Datacolumns(total4columns):
  6. year24092non-nullint64
  7. artist24092non-nullobject
  8. track24092non-nullobject
  9. time24092non-nullobject
  10. dtypes:int64(1),object(3)
  11. memoryusage:753.0+KB
  12. None

下面调用.drop_duplicates()函数删除重复数据。

  1. In[11]:tracks_no_duplicates=tracks.drop_duplicates()
  2. ...print(tracks_no_duplicates.info())
  3. ...
  4. <class'pandas.core.frame.DataFrame'>
  5. Int64Index:317entries,0to316
  6. Datacolumns(total4columns):
  7. year317non-nullint64
  8. artist317non-nullobject
  9. track317non-nullobject
  10. time317non-nullobject
  11. dtypes:int64(1),object(3)
  12. memoryusage:12.4+KB
  13. None

删完之后我们发现,数据量减少到了317个,内存占用缩减至12.4+KB。

07

填充缺失值

数据集中经常会存在缺失值,学会正确处理它们很重要,因为在计算的时候,有些无法处理缺失值,有些则在默认情况下跳过缺失值。而且,了解缺失的数据,并思考用什么值来填充它们,对做出无偏的数据分析至关重要。

同样是来自DataCamp的一个存在缺失值的数据集:

  1. In[3]:airquality.head(10)
  2. Out[3]:
  3. OzoneSolar.RWindTempMonthDay
  4. 041.0190.07.46751
  5. 136.0118.08.07252
  6. 212.0149.012.67453
  7. 318.0313.011.56254
  8. 4NaNNaN14.35655
  9. 528.0NaN14.96656
  10. 623.0299.08.66557
  11. 719.099.013.85958
  12. 88.019.020.16159
  13. 9NaN194.08.669510

以"Ozone"列为例,我们可以调用fillna()函数,用该列的均值.mean()填充NaN值。

  1. oz_mean=airquality.Ozone.mean()
  2. airquality['Ozone']=airquality['Ozone'].fillna(oz_mean)
  3. print(airquality.head(10))
  4. OzoneSolar.RWindTempMonthDay
  5. 041.000000190.07.46751
  6. 136.000000118.08.07252
  7. 212.000000149.012.67453
  8. 318.000000313.011.56254
  9. 443.195402NaN14.35655
  10. 528.000000NaN14.96656
  11. 623.000000299.08.66557
  12. 719.00000099.013.85958
  13. 88.00000019.020.16159
  14. 943.195402194.08.669510

三、总结

了解如何进行数据清洗非常重要,因为它是数据科学的重要组成部分。好在Python提供了非常好用的PandasNumPy库来帮助我们清理数据集,本文介绍的方法都是在实际中经常会用到的,希望大家能牢记于心。

【编辑推荐】

  1. Docker 数据持久化的三种方案,你总能用到
  2. 微软工程师建议换掉 Chromium 代码库中的单词:黑名单和白名单
  3. 中国芯片争论:买关键技术还是自己重新研发?
  4. 谷歌开源代码评审规范:好坏代码应该这样来判断
  5. 26岁当上数据总监,分享第一次做Leader的心得

地址: 电话:
Copyright © 2018 凯发娱乐备用网址凯发娱乐备用网址-凯发娱乐网址 All Rights Reserved