今日学习进度:
1.数据清洗
1.1查看与处理缺失值
缺失值指的是由于某种原因导致数据为空,这种情况一般有四种处理方式:不处理、删除、填充或替换、插值(以均值、中位数、众数等填补)
1.1.1查看缺失值
主要使用info方法
import pandas as pd
df=pd.read_excel('TB2018.xls')
print(df)
print(df.info())
结果
买家会员名 买家实际支付金额 宝贝总数量 宝贝标题 类别 订单付款时间
0 mr001 143.50 2.0 Python黄金组合 图书 2018-10-09 22:54:26
1 mr002 78.80 1.0 Python编程锦囊 NaN 2018-10-09 22:52:42
2 mr003 48.86 1.0 零基础学C语言 图书 2018-01-19 12:53:01
3 mr004 81.75 NaN SQL Server应用与开发范例宝典 图书 2018-06-30 11:46:14
4 mr005 299.00 1.0 Python程序开发资源库 NaN 2018-03-23 18:25:45
5 mr006 41.86 1.0 零基础学Python 图书 2018-03-24 19:25:45
6 mr007 55.86 1.0 C语言精彩编程200例 图书 2018-03-25 11:00:45
7 mr008 41.86 NaN C语言项目开发实战入门 图书 2018-03-26 23:11:11
8 mr009 41.86 1.0 Java项目开发实战入门 图书 2018-03-27 07:25:30
9 mr010 34.86 1.0 SQL即查即用 图书 2018-03-28 18:09:12
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 买家会员名 10 non-null object
1 买家实际支付金额 10 non-null float64
2 宝贝总数量 8 non-null float64
3 宝贝标题 10 non-null object
4 类别 8 non-null object
5 订单付款时间 10 non-null datetime64[ns]
dtypes: datetime64[ns](1), float64(2), object(3)
memory usage: 608.0+ bytes
None
可以看见缺失值被NaN表示出来
判断数据是否存在缺失值,可以使用isnull和notnull方法
print(df.isnull())
print(df.notnull())
输出结果
买家会员名 买家实际支付金额 宝贝总数量 宝贝标题 类别 订单付款时间
0 False False False False False False
1 False False False False True False
2 False False False False False False
3 False False True False False False
4 False False False False True False
5 False False False False False False
6 False False False False False False
7 False False True False False False
8 False False False False False False
9 False False False False False False
买家会员名 买家实际支付金额 宝贝总数量 宝贝标题 类别 订单付款时间
0 True True True True True True
1 True True True True False True
2 True True True True True True
3 True True False True True True
4 True True True True False True
5 True True True True True True
6 True True True True True True
7 True True False True True True
8 True True True True True True
9 True True True True True True
使用isnull方法,缺失值返回True;非缺失值返回False;而notnull方法与isnull相反
如果使用df[df.isnull()==False]语句,则会将所有不是缺失值的数据找出来,但是只针对Series对象。
1.1.2缺失值删除处理
将缺失值删除,主要使用dropna方法,该方法用于删除含有缺失值的行。
df = df.dropna()
输出结果
买家会员名 买家实际支付金额 宝贝总数量 宝贝标题 类别 订单付款时间
0 mr001 143.50 2.0 Python黄金组合 图书 2018-10-09 22:54:26
2 mr003 48.86 1.0 零基础学C语言 图书 2018-01-19 12:53:01
5 mr006 41.86 1.0 零基础学Python 图书 2018-03-24 19:25:45
6 mr007 55.86 1.0 C语言精彩编程200例 图书 2018-03-25 11:00:45
8 mr009 41.86 1.0 Java项目开发实战入门 图书 2018-03-27 07:25:30
9 mr010 34.86 1.0 SQL即查即用 图书 2018-03-28 18:09:12
有时可能出现整行为空的情况,此时可以在dropna方法中指定参数how='all',删除所有空行。
如果认为有些数据虽然存在缺失值,但是不影响数据分析,那么可以使用以下方法处理。例如,在上述数据中只保留“宝贝总数量”中不存在缺失值的数据,而类别是否缺失无所谓,则可以使用notnull方法判断
df1 = df[df['宝贝总数量'].notnull()]
输出结果
买家会员名 买家实际支付金额 宝贝总数量 宝贝标题 类别 订单付款时间
0 mr001 143.50 2.0 Python黄金组合 图书 2018-10-09 22:54:26
1 mr002 78.80 1.0 Python编程锦囊 NaN 2018-10-09 22:52:42
2 mr003 48.86 1.0 零基础学C语言 图书 2018-01-19 12:53:01
4 mr005 299.00 1.0 Python程序开发资源库 NaN 2018-03-23 18:25:45
5 mr006 41.86 1.0 零基础学Python 图书 2018-03-24 19:25:45
6 mr007 55.86 1.0 C语言精彩编程200例 图书 2018-03-25 11:00:45
8 mr009 41.86 1.0 Java项目开发实战入门 图书 2018-03-27 07:25:30
9 mr010 34.86 1.0 SQL即查即用 图书 2018-03-28 18:09:12
1.1.3缺失值填充处理
DataFrame对象中的fillna函数可以实现填充缺失数据,pad/ffill函数表示用一个非缺失值去填充该缺失值,backfill/bfill函数表示用下一个非缺失值填充该缺失值,Name用于指定一个值去替换缺失值。
对于用于计算的数值型数据,如果为空,可以选择用0填充。
df['宝贝总数量'] = df['宝贝总数量'].fillna(0)
1.1.4重复值处理
对于数据中存在的重复数据,包括重复的行或者某几行中某几列的值重复,一般做删除处理,使用DataFrame对象中的drop_duplicates方法
print(df.duplicated())
如果返回值为False,表示不重复,返回值为True,表示重复。
去除全部重复的数据
print(df.drop_duplicates())
去除指定列的重复数据
print(df.drop_duplicates(['买家会员名']))
保留重复行中的最后一行
print(df.drop_duplicates(['买家会员名'],keep='last'))
keep的值有三个,keep='first'表示保留第一次出现的重复行,是默认值;keep是另外两个取值last和False,分别表示保留最后一次出现的重复行和去除所有的重复行。
直接删除,保留一个副本
print(df.drop_duplicates(['买家会员名','买家支付宝账号'],inplace=False))
inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。
1.1.5异常值的检测与处理
异常值是指超出或低于正常范围的值,检测有以下方法
(一)根据给定的数据范围进行判断,不在范围内的数据视为异常值
(二)均方差
(三)箱型图
处理方式有以下几种:
(一)最常用的方式是删除
(二)将异常值当缺失值处理,以个值填充
(三)将异常值当特殊情况进行分析,研究异常值出现的原因
2.索引设置
2.1重新设置索引
Pandas有一个很重要的方法是reindex,它的作用是创建一个适应新索引的新对象。语法如下:
DataFrame.reindex(labels = None,index = None,columns = None,axis = None,method = None,copy = True,level = None,fill_value = NaN,limit = None,tolerance = None)
method:默认值为None,重新设置索引时,选择插值(用来填充缺失数据)方法,其值可以是None,bfill/backfill(向后填充)、fill/pad(向前填充)等
fill_value:缺失值要填充的数据。如缺失值不用NaN填充,用0填充,则设置“fill_value=0”即可。
2.1.1对Series对象重新设置索引
import pandas as pd
s1 = pd.Series([88, 60, 75], index=[1, 2, 3])
print(s1)
print(s1.reindex([1, 2 , 3, 4, 5]))
输出结果
1 88
2 60
3 75
dtype: int64
1 88.0
2 60.0
3 75.0
4 NaN
5 NaN
dtype: float64
reindex方法根据新索引进行了重新排序,并且对缺失值自动填充NaN,不想用NaN填充可以为fill_value参数指定值,例如0。
print(s1.reindex([1, 2 , 3, 4, 5], fill_value=0))
而对于有一定顺序的数据,则可能需要插值来填充缺失的数据,可使用method参数
实现向前填充(和前面数据一样)、向后填充(和后面数据一样),代码如下
print(s1.reindex([1, 2 , 3, 4, 5], method='ffill'))
print(s1.reindex([1, 2 , 3, 4, 5], method='bfill'))
输出结果
1 88
2 60
3 75
4 75
5 75
dtype: int64
1 88.0
2 60.0
3 75.0
4 NaN
5 NaN
dtype: float64
2.1.2对DataFrame对象重新设置索引
对于DataFrame对象,reindex方法用于修改行索引和列索引
通过二维数组创建成绩表,代码如下
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
data = [[110, 105, 99], [105, 88, 115], [109, 120, 130]]
index = ['mr001', 'mr002', 'mr003']
columns = ['语文', '数学', '英语']
df = pd.DataFrame(data=data, columns=columns, index=index)
print(df)
通过reindex方法重新设置行索引
df = df.reindex(['mr001', 'mr002', 'mr003', 'mr004', 'mr005'])
通过reindex方法重新设置列索引
df = df.reindex(columns=['语文', '数学', '英语', '物理'])
通过reindex方法重新设置行索引和列索引
df = df.reindex(index=['mr001', 'mr002', 'mr003', 'mr004', 'mr005'], columns=['语文', '数学', '英语', '物理'])
2.2设置某列为索引
设置某列为行索引主要使用set_index方法
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('1月.xlsx')
print(df.head())
买家会员名 买家实际支付金额 收货人姓名 宝贝标题
0 mrhy1 41.86 周某某 零基础学Python
1 mrhy2 41.86 杨某某 零基础学Python
2 mrhy3 48.86 刘某某 零基础学Python
3 mrhy4 48.86 张某某 零基础学Python
4 mrhy5 48.86 赵某某 C#项目开发实战入门
此时默认行索引为0,1,2,3,4,下面将“买家会员名”作为行索引
df = df.set_index(['买家会员名'])
买家实际支付金额 收货人姓名 宝贝标题
买家会员名
mrhy1 41.86 周某某 零基础学Python
mrhy2 41.86 杨某某 零基础学Python
mrhy3 48.86 刘某某 零基础学Python
mrhy4 48.86 张某某 零基础学Python
mrhy5 48.86 赵某某 C#项目开发实战入门
如果在set_index方法中传入参数“drop=True”,则会删除“买家会员名”如果传入“drop=False”,则会保留“买家会员名”,默认为False.
2.3数据清洗后重新设置连续的行索引
当我们对Dataframe对象进行数据清洗后,例如,去掉含NaN的行后,发现行索引没有变化。
如果我们要重新设置索引可以使用reset_index方法,在删除缺失数据后重新设置索引,代码如下
df=df.dropna().reset_index(drop=True)
这里设置drop=True才可以删除之前索引。