动手学数据分析之“数据清洗及特征处理”
动手学数据分析之“数据清洗及特征处理”
1数据清洗
1.1缺失值观察和处理
1.1.1缺失值观察
使用df.info()可以获得数据的索引,数据类型和内存信息
df.info()
使用.isnull()函数可以观察缺失值
df.isnull()
使用,sum()函数可以进行统计
df.isnull().sum()
1.1.2处理缺失
法1:
使用isnull()函数进行判断然后替代为0
df = pd.read_csv('train.csv')
df[df['Age'].isnull()]=0
(df['Age']==0).sum()
法2:
使用dropna()函数,该函数会将包含null的所在行直接抛弃,而且不能对列单独进行选择列
df = pd.read_csv('train.csv')
df = df.dropna()
df['Age']
法3:
也可以使用fillna()函数,将缺失值填补上,fillna默认会返回新对象,但也可以对现有对象进行就地修改(inplace=True),该方法较灵活且不丢弃数据:
df.fillna(0)
_ = df.fillna(0, inplace=True)
df['Age']
1.2重复值观察与处理
1.2.1查看数据中的重复值
可以使用.duplicated()函数,该方法返回一个布尔型Series,表示各行是否是重复行(前面出现过的行):
df.duplicated(['Age'])
还可以对多个列的数据进行判断:
df.duplicated(['Age','Pclass'])
1.2.2处理重复值
法1:使用drop_duplicates()删除重复值:
df.drop_duplicates(['Age'])
2.特征观察与处理
面元划分:为了便于分析,连续数据常常被离散化或拆分为“面元”(bin)。
可以使用.cut()进行多种划分。
等间隔划分:
df['AgeBand'] = pd.cut(df['Age'], 5,labels = ['1','2','3','4','5'])
df.head(3)
指定间隔划分,区间的开闭可以由right=False进行控制:
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = ['1','2','3','4','5'])
df.head(3)
按照比例进行划分:
#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = ['1','2','3','4','5'])
df.head(3)
2.1对文本进行转换
(1)可以使用value——counts()函数对列的内容进行计数:
df['Sex'].value_counts()
(2)可以使用replace()函数,对文本内容进行替换
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head(3)
(3)通过data.map,所有字符串和正则表达式方法都能被应用于(传入lambda表达式或其他函数)各个值。
df['Sex_num'] = df['Sex'].map({'male': 33, 'female': 15})
df.head(3)
(4)使用get_dummy()方法可以获得one_hot变量
for feat in ["Age", "Embarked"]:
# x = pd.get_dummies(df["Age"] // 6)
# x = pd.get_dummies(pd.cut(df['Age'],5))
x = pd.get_dummies(df[feat], prefix=feat)
df = pd.concat([df, x], axis=1)
#df[feat] = pd.get_dummies(df[feat], prefix=feat)
df.head()
2.2提取特征
从文本中提取特征可以使用正则表达式(对正则表达式的学习较花时间,后期有时间和必要再进行学习):
比如这个从Name中提取称谓特征的例子:
上一篇: 数据分析入门(二)数据清洗
下一篇: 茄子快传数据分析(一)----数据清理