pandas--数据预处理知识整理

数据合并

1、轴向堆叠数据 concat()函数

pd.concat(objs.axis=0,join=’outer’,ignore_index=False)

obj:用于连接的数据    

axis:用于连接的轴向,0是纵向,1是横向  

join:连接方式,inner是内连接,outer是左连接    

ignore_index:清除现在索引并重置索引值

import pandas as pd
import numpy as np
df1=pd.DataFrame({'A':['A0','B0','A1'],'B':['B0','B0','B1']})
df1
df2=pd.DataFrame({'C':['C0','C0','C1','C3'],'D':['D0','D2','D2','D3']})
df2
#横向堆叠合并df1和df2,采用外连接的方式
pd.concat([df1,df2],axis=1,join='outer')

2、主键合并数据 merge()函数

通过一个或多个键将两个数据集的行链接来,类似于SQL中的join

 pd.merge(left,right,how=’inner’,on=None,left_on=None,right_on=None)

left,ritht:用于合并的左/右侧的DataFrame对象    

how:表示连接方式,默认是inner,可以选择outer,left,right

on:用于指定连接的列名,on可以指定多个列名

left_on/right_on:左/右侧数据用于连接的列名

info=pd.DataFrame({'产品编号':list('ABCD'),
                  '产品名称':['电视机','手机','电脑','空调'],
                   '品牌':['格力','康佳','海信','TCL']},index=range(1001,1005))
info
sale=pd.DataFrame({'产品编号':list('ABECDF'),
                  '品牌':['格力','康佳','海信','TCL','康佳','格力'],
                  '价格':[3600,1500,4500,2000,3000,2500]},
                 index=range(1001,1007))
sale
# 1、使用默认连接方式连接产品信息和产品销售数据集
pd.merge(info,sale)
# 2、分别用left、right、outer连接方式连接数据集
pd.merge(info,sale,how='left')
pd.merge(info,sale,how='right')
pd.merge(info,sale,how='outer')
# 3、按照指定“产品编号”列名合并产品信息和产品销售数据集
pd.merge(info,sale,on='产品编号')
# 4、根据“产品编号”和“品牌”多个键进行连接
pd.merge(info,sale,on=['产品编号','品牌'])

3.根据行索引合并数据 join()方法

通过索引或特定的列来连接多个DataFrame对象,默认的是通过index进行连接,也可以通过设置参数on来指定连接的列。

DataFrame.join(other,on=None,how=’left’,lsuffix=”,resuffix=”,sort=False)

other:表示参与连接的其他DataFrame。

on:用于指定连接的列名,on可以指定多个列名

how:数据连接方式,默认为left,可选inner,outer,right

lsuffix/rsuffix:接收字符串,用于在左右侧重叠的列名候添加后缀名

# 1、使用默认连接方式,左侧重复的列名添加后缀名“_1”
info.join(sale,lsuffix='_1'
# 2、使用外连接方式,右侧重复的列名添加后缀名“_2”
info.join(sale,rsuffix='_2',how='outer')

4、根据行索引合并数据combine_first()方法

 DataFrame.combine_first(other)   other:用于接收填充缺失值的DataFrame对象

数据清洗

缺失值的处理

使用innull()和notnull()函数可以判断数据集中是否存在空值和缺失值

对于缺失数据可以使用dropna()和fillna()方法对缺失值进行删除和填充

 panda.innull(obj) 检测是否为空值   eg: pd.isnull(df1) 

 dropna(axis=0how=’any’,subset=None,inpace=False) 删除缺失值

             axis 确认过滤的行或列 1列 0行

            how:过滤的标准,any:存在NaN值,则删除;all:所有值是NaN,删除

fillna(value=None,method=None,axis=None,inplace=False,limit=None)

            value:用于填充的数值,可以指定空值填充,通过字典的形式

            method:填充方式 1>pad/ffill:缺失值前面的值代替缺失值

                         2>backfill/bfill:缺失值后面的一个值代替缺失值

注意:valuemethod不能同时使用

重复值的处理

duplicated(subset=None,keep=’first’) 用于标记是否有重复值,

         subset:用于识别重复的列标签或列标签序列,默认识别所有的列标签

          keep:删除重复项并保留第一次出现的项,取值可以是first,last,False

drop_duplicates(subset=None,keep=’first’,inplace=False) 用于删除重复值

示例代码如下:

df_obj=pd.DataFrame({'A':[1,2,3,np.nan],
                    'B':[np.nan,4,np.nan,6],
                    'C':['a',7,8,9],
                    'D':[np.nan,2,3,np.nan]})
df_obj
#1 使用innull()检查是否为缺失值
pd.isnull(df_obj)
#2 使用notnull()检查是否不为缺失值
pd.notnull(df_obj)
#3 借助sum()函数统计缺失值的数目
df_obj.isnull().sum()
# 4使用88.0替换缺失值
df_obj.fillna('88.0')
#5 创建datafarame对象  使用1.0填充a列缺失的数据 2.0填充b列的数据  4.0填充d
df_obj=pd.DataFrame({'A':[1,2,3,np.nan],
                    'B':[np.nan,4,np.nan,6],
                    'C':['a',7,8,9],
                    'D':[np.nan,2,3,np.nan]})
df_obj
df_obj.fillna({'A':1.0,'B':2.0,'D':4.0})
#6、重新创建如图所示DataFrame对象,使用缺失值后面的一个值代
替缺失值。
df_obj=pd.DataFrame({'A':[1,2,3,np.nan],
                    'B':[np.nan,4,np.nan,6],
                    'C':['a',7,8,9],
                    'D':[np.nan,2,3,np.nan]})
df_obj
df_obj.fillna(method='bfill')
#重复值处理
person_info=pd.DataFrame({'id':[1,2,3,4,4],
                          'name':['李明','周华','彭艳','刘华','刘华'],
                         'age':[18,18,29,58,58],
                         'height':[180,150,185,175,175]})
person_info
# 1、创建如图所示DataFrame对象,使用duplicated0从前向后查找和判断是否有重复值,并删除重复值,不#修改原始数据;
person_info.duplicated(subset=None, keep='first')
# 2、重新创建如图所示DataFrame对象,使用duplicated从后向前查找和判断是否有重复值,c
person_info=pd.DataFrame({'id':[1,2,3,4,4],
                          'name':['李明','周华','彭艳','刘华','刘华'],
                         'age':[18,18,29,58,58],
                         'height':[180,150,185,175,175]})
person_info
# 使用duplicated从后向前查找和判断是否有重复值,
person_info.duplicated(keep='last')
# 使用duplicated从后向前查找和判断是否有重复值,
person_info.drop_duplicates(keep='last',inplace=True)
person_info

异常值的处理

1.  3σ原则   【背过定义的那个函数】

def three_sigma(ser):
    mean_value=ser.mean()
    std_value=ser.std()
    # [mean-3std,mean+3std]
    rule=(ser<(mean_value-3*std_value)) | (ser >(mean_value+3*std_value))
    ser.loc[rule]
    outrange=ser.loc[rule]
    return outrange
three_sigma(df['B'])

2.箱线图分析

boxplot()方法

data.boxplot(column=['age','score'])

检测出异常值后,通常会采用如下四种方式处理这些异常值

1直接将含有异常值的记录删除。

2用具体的值来进行替换,可用前后两个观测值的平均值修正该异常值。

3不处理,直接在具有异常值的数据集上进行统计分析。

4视为缺失值,利用缺失值的处理方法修正该异常值

对异常值进行修改

replace(to_replace=None,value=None,inplace=False) 

        to_replace:表示查找背替换值得方法 value表示替换to_replace的值

更改数据类型

1、通过dtype属性查看数据类型

通过astpye()方法强制转换数据的类型

   astpye(dtype,copy=True,errors=’raise’)

     dtype:表示数据的类型

     errors:错误采取的处理方式,可以取值为raise或者ignore

2..to_numeric()函数可以将传入的参数转换为数值类型

pandas.to_numerci(arg,error=’raise’)

数据重塑

层次化索引可以理解为单层索引的延伸,即在一个轴方向上具有多层索引

重塑层次化索引

stack()  à 列转行   unstack() à 行转列

DataFrame.stack(level=-1,dropna=True)

            Level:表示操作内层索引,如果是0,表示操作外层索引

            Dropna:表示是否将旋转后的缺失值删除

轴向旋转

pivot(index=None,columns=None,values=None)

               index:用于创建新DataFrame对象的行索引

           columns:用于创建新DataFrame对象的列索引

           vules:用于填充新DataFrame对象的值

数据转换

重命名轴索引

rename(index=None,columns=None,inplace=False)

            index,columns:表示对行索引名或列索引名的转换

离散化连续性数据

pandas.cut(x,bins,right=True,labels=None)

  x:表示要分箱的数组,必须是一维的

  bins:划分多少个区间,接受int类型

  right:是否包含右端点,决定区间的开闭。

你可能感兴趣的:(pandas,python,数据挖掘)