我们分析的数据来源有很多种,例如:爬取、公司数据库、数据公司等。但是这些数据中有些数据项是我们不需要的,甚至可能会存在重复数据和空值的情况。
一、删除数据
import pandas as pd
df = pd.read_excel(r'C:\Users\lin-a\Desktop\data\rate.xlsx')
print(df.shape)
print(df.head())
# 输出结果:
(219, 15)
CountryName Country Code 1990 2000 2007 \
0 Afghanistan AFG 101.094930 103.254202 100.000371
1 Albania ALB 61.808311 59.585866 50.862987
2 Algeria DZA 87.675705 62.886169 49.487870
3 American Samoa ASM NaN NaN NaN
4 Andorra ADO NaN NaN NaN
2008 2009 2010 2011 2012 2013 \
0 100.215886 100.060480 99.459839 97.667911 95.312707 92.602785
1 49.663787 48.637067 NaN 46.720288 45.835739 45.247477
2 48.910002 48.645026 48.681853 49.233576 49.847713 50.600697
3 NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN
2014 2015 Change 1990-2015 Change 2007-2015
0 89.773777 86.954464 -14.140466 -13.045907
1 44.912168 44.806973 -17.001338 -6.056014
2 51.536631 52.617579 -35.058127 3.129709
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
在结果中,我们发现有多个NaN,表明的是文件的单元格中没有值,在使用pandas读取后就会用NaN表示,也就是我们常说的空值。
在Numpy中提供了nan的值,如果你想要创建一个空值可以使用如下的代码:
from numpy import nan as NaN
而且需要注意的是,NaN比较特殊的点是其本身是float类型的数据
from numpy import nan as NaN
print(type(NaN))
# 输出结果:
<class 'float'>
当NaN参与到数据计算中,其最终结果永远都是NaN。
from numpy import nan as NaN
print(NaN+1)
# 输出结果:
nan
所以,空值是会影响我们的计算结果的。
对于大批量的Series数据,使用肉眼很难判断空值的存在,此时,我们需要先对空值进行过滤。
import pandas as pd
se = pd.Series([4,NaN,8,NaN,5])
print(se.notnull())
print('='*20)
print(se[se.notnull()])
# 输出结果:
0 True
1 False
2 True
3 False
4 True
dtype: bool
====================
0 4.0
2 8.0
4 5.0
dtype: float64
而在DataFrame类型数据中,一般我们会将存在NaN的数据使用dropna()方法全部删掉。
df1 = df.dropna()
dropna()是删除空值数据的方法:
- 默认将含有NaN的整行数据删掉;
- 若想要删除整行都是空值的数据需要添加how='all’参数;
- 如果要对列做删除操作,需要添加axis参数:axis=1表示列,axis=0表示行;
- 也可以使用thresh参数筛选要删除的数据,thresh=n保留至少n个非NaN数据的行。
那么,如果我只是想要删除两行数据该怎么做呢?可以使用df.drop()方法,了解一下该函数:
DataFrame.drop(labels=None,axis=0,index=None,columns=None,inplace=False)
详细参数如下所示:
- labels:就要删除的行或列的名字,用列表给定
- index:直接指定要删除的行
- columns:直接指定要删除的列
- inplace=False:默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe
- inplace=True:会直接在源数据上进行删除操作,删除后无法还原
所以,根据参数可以总结出删除行列有两种方式:
- labels = [],axis=0的组合
- index或columns直接指定要删除的行或列
# 第一种方法
import pandas as pd
df = pd.read_excel(r'C:\Users\lin-a\Desktop\data\rate.xlsx')
# 删除第2行和第3行
df3 = df.drop(labels=[0,1],axis=0)
print(df3)
# 输出结果:
CountryName Country Code 1990 2000 2007 2008 2009 2010 2011 2012 2013 2014 2015 Change 1990-2015 Change 2007-2015
2 Algeria DZA 87.675705 62.886169 49.487870 48.910002 48.645026 48.681853 49.233576 49.847713 50.600697 51.536631 52.617579 -35.058127 3.129709
3 American Samoa ASM NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 Andorra ADO NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 Algeria DZA 87.675705 62.886169 49.487870 48.910002 48.645026 48.681853 49.233576 49.847713 50.600697 51.536631 52.617579 -35.058127 3.129709
6 Angola AGO 101.394722 100.930475 102.563811 102.609186 102.428788 102.035690 102.106756 101.836900 101.315234 100.637667 99.855751 -1.538971 -2.708060
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
214 Virgin Islands (U.S.) VIR 53.546901 52.647183 49.912779 50.459425 51.257336 52.382523 53.