【数据分析】(task2)数据清洗及特征处理

note

一、缺失值观察和处理

  • 数据清洗:如缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的格式
# 查看df的总体情况
df.info()

# 查看每列的缺失值个数
df.isnull().sum()

# 对缺失值进行处理
# 1. 如将age年龄列的缺失值进行填充0
df[df['Age'] == None] = 0
df[df['Age'].isnull()] = 0
df[df['Age'] == np.nan] = 0

# 2. 直接除去缺失值
df.dropna()
df.fillna(0) # 对缺失值填充0

如果某个方法无法找到缺失值:数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan

二、重复值观察和处理

# 查看重复行
df[df.duplicated()]

# 除去重复行
df = df.drop_duplicates()

三、特征观察和处理

原数据有两大类特征:

  • 数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
  • 文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征

3.1 对年龄分箱处理(离散化)

#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])

#将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])

#将连续变量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])

3.2 对文本变量转换

查看文本变量种类:

# 1. 查看文本变量种类(两种方法)
df['Sex'].value_counts()
df['Sex'].unique() # array(['male', 'female', 0], dtype=object)
df['Sex'].nunique() # 3

对文本变量进行编码的三种方式:

# 方法一: replace(将类别文本转换为12345)
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])

# 方法二: map
df['Sex_num'] = df['Sex'].map({
    
    'male': 1, 'female': 2})

# 方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
    df[feat + "_labelEncode"] = df[feat].map(label_dict)
    df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))

# 方法四: onehotEncoder
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)

3.3 从纯文本Name特征里提取出Titles的特征

(所谓的Titles就是Mr,Miss,Mrs等)

df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)

时间安排

任务 任务内容 时间 完成情况
- 1月16日周一开始
Task01: 数据加载及探索性数据分析(第一章第1,2,3节)(2天) 16-17日周二 完成
Task02: 数据清洗及特征处理(第二章第1节)(2天) 18-19日周四 完成
Task03: 数据重构(第二章第2,3节)(2天) 20-21日周六
Task04: 数据可视化(第二章第4节)(2天) 22-23日周一
Task05: 数据建模及模型评估(第三章第1,2节)(3天) 24-26日周四

Reference

[1] https://github.com/datawhalechina/hands-on-data-analysis
[2] pandas常用操作详解——pandas的去重操作df.duplicated()与df.drop_duplicates()
[3] https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.qcut.html

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/128680041