Advertisement

Python数据分析——数据清洗及特征处理

阅读量:

数据清洗及特征处理

  • 数据清洗

    • 缺失值观察与处理
    • 重复值观察与处理
  • 特征处理

    • 分箱处理
    • 对文本变量进行转换

数据清洗

原始数据当中经常会有很多缺失值、异常值等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗。

缺失值观察与处理

(一)缺失值观察

复制代码
    #查看数据属性
    data.info()
    #按列统计缺失值
    data.isna().sum()
    #同时观察多列数据
    data[['Age','Cabin','Embarked']]

(二)缺失值处理
缺失值处理可分为两个部分,一个是直接删除,如:dropna()函数;另一个是填充的方式,如fillna()函数。
DataFrame.dropna(self, axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

  • axis:{0,1}是否删除包含缺失值的行或列,0表示行,1表示列
  • how:{‘any’,‘all’}'any’表示存在NA,则删除行或列,‘all’表示所有值均为NA则删除行或列
复制代码
    data_1 = data['Age'].dropna()
    data[data['Age']==np.isnan(np.nan)]=0
    #isunull能较好填充,但是是含缺失值的行数据均填充为0
    data[data['Age'].isnull()]=0
    data.dropna()

**DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, kwargs)

  • value:用于填充缺失值(例如0),或者指定值来进行填充
  • method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}默认值为None,前两种是向前填充,之后两种是向后填充
复制代码
    data_1=data.fillna(value=0)

重复值观察与处理

(一)重复值观察
duplicated()用于标记Series中的值、DataFrame中的记录行是否是重复,重复为True,不重复为False
data.duplicated(self, subset=None, keep=‘first’)

  • subset:用于识别重复的列标签或列标签序列,默认所有列标签
  • keep:{‘frist’,‘last’,‘False’}first表示除了第一次出现外,其余相同的被标记为重复;Last除了最后一次出现外,其余相同的被标记为重复;False所有相同的都被标记为重复
复制代码
    data[data.duplicated()]

(二)重复值处理
data.drop_duplicates(self, subset=None, keep=‘first’, inplace=False)

复制代码
    data.drop_duplicates()

特征处理

分箱处理

**分箱处理:**是把一段连续的值切分成若干段,每一段的值看成一个分类。通常把连续值转换成离散值的过程在pandas中,cut和qcut函数都可以进行分箱处理操作。

  • qcut函数则是根据数据本身的数量来对数据进行分割。
  • cut()是按照数据的值进行分割
    1.将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
复制代码
    data_cut = data.copy() #复制数据集
    #查看cut()
    #help(pd.cut)
    data_cut['cut_group'] = pd.cut(x=data_cut['Age'],bins=5,labels=range(1,6))
    data_cut

2.将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示

复制代码
    data_cut['cut_group'] = pd.cut(x=data_cut['Age'],bins=[0,5,15,30,50,80],labels = [1,2,3,4,5])
    data_cut

3.将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示

复制代码
    data_cut['cut_group'] = pd.qcut(x=data_cut['Age'],q=[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
    data_cut

对文本变量进行转换

(一)查看数值类别
data.values:查看数据值,输出为数组
data.value_counts():可查看某列数据类别和数目
np.unique():删除重复元素,并按元素从大到小排列输出一个新的列表或元组

复制代码
    #第一种方法
    data['Sex'].value_counts()
    #第二种方法
    data['Sex'].unique()

(二)文本转换
1.replace(a,b):b替换a

复制代码
    data['Sex_num'] = data['Sex'].replace(['male','female'],[1,2])

2.map

复制代码
    #data['Sex_num'] = data['Sex'].map({'male': 1, 'female': 2})
    sex_dic = {'male':1,'female':0}
    data['Sex_num'] = data['Sex'].map(sex_dic)

3.LabelEncoder

复制代码
    from sklearn.preprocessing import LabelEncoder
    for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(data[feat].unique(), range(data[feat].nunique())))
    data[feat + "_labelEncode"] = data[feat].map(label_dict)
    data[feat + "_labelEncode"] = lbl.fit_transform(data[feat].astype(str))

4.从文本中提取特征

复制代码
    从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等

str.extract(pat, flags=0, expand=None)
可用正则从字符数据中抽取匹配的数据,只返回第一个匹配的数据

  • pat:字符串或正则表达式
  • flags:整型
  • expand:布尔型,是否返回DataFrame
复制代码
    data['Title'] = data.Name.str.extract('([A-Za-z]+)\.', expand=False)

全部评论 (0)

还没有任何评论哟~