数据预处理

删除数据中的空缺值

数据中的空缺值导入到DataFrame中一般会以NaN或者null的形式进行显示。通常情况下数据清洗的第一步我们要先除掉这些空缺值。

ana是没有办法和任何数据进行比较的,它不和任何值相等,包括他自己(因此也可以用 a != a 来判断a是否是nan)。

所以在后面的数据处理中如果进行了比较操作则会报错:

TypeError: invalid type comparison

所以有两种思路

第一种: 比如说要清除Date_received列的所有空缺值:

dfoff = pd.read_csv('datalab/59/ccf_offline_stage1_train.csv')
dfoff[~(dfoff['Date_received'] != dfoff['Date_received'] )]

这种方法比较复杂,代码不易阅读,不推荐。

第二种: 在读取csv的时候加上参数keep_default_na=False,这样这样没有数据的条目就会被识别为空字符’ ‘而不是nan了。我们实现删除数据中的空缺值办法可以这样写:

dfoff = pd.read_csv('datalab/59/ccf_offline_stage1_train.csv', keep_default_na=False)
dfoff[(dfoff['Date_received'] != 'null') & (dfoff['Date'] != 'null')] #将Date_received和Data列的空缺值都剔除

类型转换

有的时候可能导入的数据类型不能满足处理要求,这时候需要进行类型转换,比如str转换成int类型。

df['distance'] = df['Distance'].replace('null', -1).astype(int)

对已有的列进行处理生成新的特征列

我们可以使用Pandas的apply方法对已有的列进行处理,该方法的第一个参数为func,也就是我们可以自己定义一个对列数据进行处理的函数,演示如下:

def getDiscountType(row):
    if row == 'null':
        return 'null'
    elif ':' in row:
        return 1
    else:
        return 0
        
df['discount_rate'] = df['Discount_rate'].apply(getDiscountType)

# 其中Discount_rate是已有的列,discount_rate将会是对Discount_rate列处理后的新生成的列
# 处理函数是getDiscountType

涉及时间操作

统一时间格式

我们导入csv或者Excel的时间格式可能多种多样,并不统一,可以使用Pandas的to_datetime来统一时间格式

date_received_dt = pd.to_datetime(date_received, format='%Y%m%d')
#一共有6个参数,还有%H:%M:%S,前三个参数是必填的,后面三个参数不填默认为0

我们用这个操作来统一时间格式还有一个作用在于我们从csv或者Excel中读取的日期数据很有可能是字符串类型,字符串类型是没有办法进行加减乘除操作的。我们通过这种类型转换之后,就变成了Timedelta类型的格式,结果类似于这个样子:

Timedelta('166 days 00:00:00')

可以进行加减乘除操作。关于如何进行比较操作,和对单独某个值转换成Timedelta会在下一部分说。

时间之间的比较

只有时间类型的数据才能和时间类型的数据进行比较,因此比较之前需要先将数据转换成Timedelta类型的格式。转换和比较方法如下:

# td是已经转换为Timedelta类型的数据,我们这里想要看td的数值是不是比15天多。
#和统一时间格式那里写的一样,Timedelta方法也可以设置6种参数(YMD、Hms)来确定时间,其中M表示的是月,m表示的是分钟

td = pd.to_datetime(row['Date'], format='%Y%m%d') -  pd.to_datetime(row['Date_received'], format='%Y%m%d')
if td <= pd.Timedelta(15, 'D'):
    return 1

探索性数据分析

对单独一列信息的探索

去一列信息去重后显示(去掉该列信息中重复的值)

print('Discount_rate 类型:',dfoff['Discount_rate'].unique()) #dfoff是打开的某pandas文件

统计该列中各个值出现的次数

使用value_counts()方法就可以。这个方法可以用于计数。这是Pandas内置的方法,用Pandas读取完文件之后就可以直接调用这个方法。

dfoff['label'].value_counts()

比较两列的数据信息(对重复数值聚合)以及画图显示

比较两列的数据信息

我们在探索性数据分析的时候常常需要比较某两个特征之间的关系。这时候往往需要用到Pandasgroupby方法。

时间序列作为排序准则对特征数据进行比较

比如说对于这样的数据,我们想按照Data_received的时间日期对其进行统计,同一时间日期下有多少个Date:

https://github.com/Einstellung/DataScience_learning/blob/master/DataScience/images/Exploratory%20Data%20Analysis/1.png?raw=trueimage

couponbydate = dfoff[dfoff['Date_received'] != 'null'][['Date_received', 'Date']].groupby(['Date_received'], as_index=False).count()

统计结果会像这样:

Date_received	Date
0	20160101	554
1	20160102	542
2	20160103	536
3	20160104	577
4	20160105	691
5	20160106	808

这里说一下as_index这个参数,如果改成True的话,被groupby的那一列会单独成为一列。如果是False的话,则不会单独成为一列。

对多列数据进行分析

显示总计有多少个特征

一般情况下,数据的第一行表示的是特征。如果想用列表的形式显示特征可以使用Pandas的tolist()进行转换:

dfoff.columns.tolist() #dfoff是用Pandas读取的csv数据