importpandasaspdimportnumpyasnpDataDF=pd.read_csv('C:/Users/jzgao/Desktop/ecommerce-data/data.csv',encoding="ISO-8859-1",dtype=str)#dtype=str,最好读取的时候都以字符串的形式读入,不然可能会使数据失真#比如一个0010008的编号可能会读取成10008#encoding="ISO-8859-1"--用什么解码,一般会默认系统的编码,如果是中文就用"utf-8"2.尝试去理解这份数据集
我们可以通过对数据集提问来判断这份数据能不能满足解答我们的问题,数据是否干净需不需要进一步处理,问题包括但不限于:
数据集多少数据?包含了什么字段?字段格式是什么?字段分别代表什么意义字段之间的关系是什么?可以用做什么分析?或者说能否满足了对分析的要求?有没有缺失值;如果有的话,缺失值多不多?现有数据里面有没有脏数据?尤其需要注意人工输入的数据,经常会出现名称写错,多输入空格等等的情况
3.下面我们就结合代码来看一下数据
1)调整数据类型:由于一开始用到了str来导入,打算后期再更换格式,需要调整数据类型。
2)修改列名:该数据的名称不易于理解,需要改列名
3)选择部分子集:因为有部分列在数据分析中不需要用到
4)可能存在逻辑问题需要筛选:比如UnitPrice为负
5)格式一致化:Description可能会存在有标点符号掺杂/大小写不一致/空格重复出现等问题
6)消灭空值:CustomerID、Description、Country和UnitPrice都出现了NaN值,需要去掉
loc这个代码有点像Excel里面的鼠标左键,可以随意拉动你需要的数据进行切片。
以逗号作为隔开的界限,左边为index,右边为column
还是Dataframe.loc这个函数的知识点。
由于loc还可以判断条件是否为True
1.大小写/去除空格
将数据中Descrption列中所有内容改成大写:
DataDF['Description']=DataDF['Description'].str.upper()DataDF.head()类似的代码还有字符串修改方法:
2.去除字符串符号去乱码
3.空格分割
DataDF.loc[:,'InvoiceDate']=splitSaletime(DataDF.loc[:,'InvoiceDate'])七、处理缺失值
python缺失值有3种:
1)Python内置的None值
2)在pandas中,将缺失值表示为NA,表示不可用notavailable。
3)对于数值数据,pandas使用浮点值NaN(NotaNumber)表示缺失数据。后面出来数据,如果遇到错误:说什么float错误,那就是有缺失值,需要处理掉
那None和NaN有什么区别呢:
None是Python的一种数据类型,
NaN是浮点类型
两个都用作空值
1.去除缺失值
#再一次提醒检查缺失数据DataDF.isnull().sum().sort_values(ascending=False)去除缺失值的知识点:
DataFrame.dropna(axis=0,how='any',thresh=None,subset=None,inplace=False)
#默认(axis=0)是逢空值剔除整行,设置关键字参数axis=1表示逢空值去掉整列#'any'如果一行(或一列)里任何一个数据有任何出现Nan就去掉整行,#'all'一行(或列)每一个数据都是Nan才去掉这整行DataDF.dropna(how='any')DataDF.dropna(how='all')#更精细的thresh参数,它表示留下此行(或列)时,要求有多少[非缺失值]DataDF.dropna(thresh=6)2.填充缺失内容:某些缺失值可以进行填充,方法有以下四种:
去除缺失值的知识点:
1)用默认值填充-df.fillna('')
我们应该去掉那些不友好的NaN值。但是,我们应该用什么值替换呢?这个时候可能要结合你对这个数据集的理解,看填充什么数据才是比较合适,以下是一下常用的方法。
在这个数据集中,我们大致判断CustomerID如果是不太重要的,就我们可以用使用""空字符串或其他默认值。
DataDF.Country=DataDF.Country.fillna('NotGiven')2)以同一指标的计算结果(均值、中位数、众数等)填充缺失值
平均值-df.fillna(df.mean())
使用数字类型的数据有可能可以通过这样的方法来去减少错误。
比如,这个案例里面的价格。如果用0或者"NotGiven"等来去填充都不太合适,但这个大概的价格是可以根据其他数据估算出来的。
DataDF.UnitPrice=DataDF.UnitPrice.fillna(DataDF.UnitPrice.mean())3)除此,还有一种常见的方法,就是用相邻的值进行填充,
print(DataDF)print(DataDF.UnitPrice.fillna(method='ffill'))#前向后填充print(DataDF.UnitPrice.fillna(method='bfill'))#后向前填充4)以不同指标的计算结果填充缺失值
关于这种方法年龄字段缺失,但是有屏蔽后六位的身份证号可以推算具体的年龄是多少。