数据处理的过程中,一般都要进行数据清洗,如数据集是否存在重复、是否存在缺失、数据是否具有完整性和一致性、数据中是否存在异常值等。当存在上述的问题时,就要进行有针对性地处理。
1.重复观测处理
检测数据集是否存在重复,可以使用duplicated进行验证,但是该方法返回的是每一行的验证结果,每行返回一个bool值,所以想要得到直接的结果,还需要再使用一个any函数。
然后进行删除重复项的操作:
缺失值处理:
一般有三种处理方法:删除法、替换法、插补法。
两种删除法进行比较,
可以看到两者的区别,记录删除法是将所有含有缺失值的记录整条都删掉;变量删除是将表中缺失值最多的那个向量整个删掉。
替换法有四种方式:
向前替换:df.fillna(method=‘ffill’)
向后替换:df.fillna(method=‘bfill’)
常熟替换:df.fillna(value=0)
统计值替换:df.fillna(value={‘gender’:df.gender.mode()[0],‘age’:df.age.mean(),
‘income’:df.income.median()})
可以看到,用统计值替换看起来是最为合理的,例子中是性别用众数替换,年龄用均值替换,收入用中位数替换。
数据子集的获取:
有三种方式,iloc , loc , ix .
可以看到我们初始的表是这样子的,我们想拿到中间三排女生的数据,三种方式如下:
df1.iloc[1:4 , [0,2]]
df1.loc[1:3 , [‘name’,‘age’]]
df1.ix[1:3 , [0,2]]
iloc前面的是行号 ,取不到上限, 后面的是列号。
loc前面的是行号,取得到上限,后面是对应的列名称。
ix前面的是行号,取得到上限,后面既可以是列号也可以是列名称。
若没有行号,第一列直接以name开头的话。操作如下:
df2 = df1.set_index(‘name’)
df2.iloc[1:4 , :]
df2.loc[[‘李四’,‘王二’,‘丁一’],:]
df2.ix[1:4 , :]
对于iloc来说,不管什么样的数据集都可以使用行索引;
对于loc来说,不能使用行标签了,只能使用对应的行向量;
对于ix来说,行标签和行号都是可以的。
如果使用筛选条件的话,只能使用loc和ix两种方法。例如,上述的数据集想要选择所有男性的名字和年龄,操作如下:
df1.loc[df1.gender == ‘男’,[‘name’,‘age’]]
df1.ix[df1.gender == ‘男’,[‘name’,‘age’]]
表的连接:
merge函数:
pd.merge(left,right,how=‘inner’,on=None,left_on=None,right_on=None,
left_index=False,right_index=False,sort=False,suffixes=(‘_x’,‘_y’))
left : 指定需要连接的主表;
right : 指定需要连接的辅表;
how : 指定连接方式,默认为inner内连,还有其他包括left左连、right右连和outer外连。
on : 指定连接两张表的共同字段。
left_on : 指定主表中需要连接的共同字段;
right_on : 指定辅表中需要连接的共同字段;
left_index : bool类型,是否将主表中的行索引用作表连接的共同字段,默认为False。
right_index : bool类型,是否将辅表中的行索引用作表连接的共同字段,默认为False。
sort : bool类型参数,是否对链接后的数据按照共同字段排序,默认为False。
suffixes : 如果数据连接的结果中有重叠的变量名,则使用各自的前缀进行区分。
举个例子:
首先构建了三个表,现在我们想将这三张表连在一起,先连接3,4,再连接5:
,可以看到,因为df3 和 df4 的共同字段是不一致的,一个是id , 一个是Id , 所以这里left_on 和 right_on 要分开指定;
再连接df5:
这里会优先匹配共同字段id , 所以right_on 不用指定,对于无法匹配到的值,会自动补上NaN。