5-Pandas数据处理

处理缺失数据

  • None
    • None是Python自带的,其类型为python object。因此,None不能参与到任何计算中
  • np.nan(NaN)
    • np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN
  • object类型相比于int类型运算时消耗时间更长
    • %timeit np.arange(1e5, dtype=object)
    • %timeit np.arange(1e5, dtype=int)
  • pandas中的None与NaN
    • pandas中None与np.nan都视作np.nan
    • pandas中None与np.nan的操作
      • 判断函数
        • df.isnull()
          • 是否为空
        • df.notnull()
          • 是否不为空
        • df.isnull().any()
          • 默认判断某一列的值
          • 有一个为True则为True,类似or
          • 某列是否存在空值
        • df.isnull().all()
          • 默认判断某一列的值
          • 全为True才为True,类似and
          • 某列是否全部为空
        • df.notnull().all(axis=1)
          • 判断某一行的值
        • df[df.notnull().all(axis=1)]
          • 获取全不为空的行,进行过滤
      • 过滤函数
        • dropna()
          • 可以选择过滤的是行还是列(默认为行)
        • df.dropna()
          • 默认删除有空的行
        • df.dropna(axis=1)
          • 删除有空的列
        • 也可以选择过滤的方式 how = 'all'
          • dropna()
            • how默认是any
          • df.dropna(how='all')
            • 某行或列的值都为空的才删除
      • 填充函数
        • fillna()
          • df.fillna(value=9999)
            • 填充指定值
            • 加inplace=True,进行修改
          • df.fillna(method='bfill')
            • axis=0,列的后面=>下
          • df.fillna(method='ffill')
          • df.fillna(method='bfill',axis=1)
            • 行的后面=>右
          • df.fillna(method='ffill',axis=1)

数据处理

  • 检测重复行

    • 使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True
    • df.duplicated()
      • 检测是否为第二次出现
    • df.duplicated(subset=['a','b','c'])
      • 只对abc三列进行检测是否重复
  • 删除重复行

    • 使用drop_duplicates()函数删除重复的行
    • df.drop_duplicates()
    • df.drop_duplicates(subset=['a','b','c'])
    • 过滤掉重复项
      • cond = df.duplicated(subset=['a','b','c'])
      • df.loc[~cond]
        • 取反
      • np.logical_not(cond)
  • 映射

    • 概述

      • 映射的含义
        • 创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
        • 需要使用字典
        • 包含三种操作
          • replace()函数:替换元素
          • map()函数:新建一列, 最重要
          • rename()函数:替换索引
    • replace()函数:替换元素

      • 使用replace()函数,对values进行替换操作
        • df.replace({85:1000,12:3000})
      • replace还经常用来替换NaN元素
        • df.replace({np.nan:0})
    • map()函数:新建一列(行也可以)

      • 使用map()函数,由已有的列生成一个新列

        • 适合处理某一单独的列
      • df2['政治'] = df2['语文'].map({84:100,11:100,78:100,24:100})

      • df2['政治'] = df2['语文'].map(lambda x:x*2)

      • def grade(x):
            if x<60:
                return '不及格'
            elif x<80:
                return '及格'
            else:
                return '优秀'
        df2['等级'] = df2['语文'].map(grade)
        
    • rename()函数:替换索引

      • df3.rename(index={'张三':'Mr Zhang'})
      • df3.rename({'张三':'Mr Zhang'})
        • 默认修改行索引
      • df3.rename(columns={'语文':'Language'})
        • 修改列索引
      • df3.rename({'数学':'Math'},axis=1)
        • 修改列索引
  • 异常值检测和过滤

    • 使用describe()函数查看每一列的描述性统计量
      • df.describe()
    • df.std()
      • 使用std()函数可以求得DataFrame对象每一列的标准差
      • 借助any()函数, 测试是否有True,有一个或以上返回True,反之返回False
        • cond = df['weight']<1000
      • 对每一列应用筛选条件,去除标准差太大的数据
        • df.loc[cond]
    • 删除特定索引df.drop(labels, inplace = True)
      • df22.drop('张三')
        • 删除行
      • df22.drop('语文',axis=1)
        • 删除指定的列
    • unique():唯一,去重
      • df22['语文'].unique()
    • df.query:按条件查询
      • df22.query('语文==24')
      • df22.query('语文20 or 数学35')
      • df22.query('语文20 | 数学63')
      • df22.query('语文>=78')
      • df22.query('语文 >= @score')
        • 使用变量
      • df22.query('语文 in @list1')
    • 排序
      • df22.sort_values('数学')
        • 默认升序
        • 按某列值排序
          • 排的是行的顺序
      • df22.sort_values('张三',axis=1)
        • 按张三各科成绩从左往右升序
          • 排的是列的顺序
      • df22.sort_values('语文',ascending=False)
        • 降序
  • 抽样

    • 使用.take()函数排序
      • 可以借助np.random.permutation()函数随机排序
    • 随机排列:打乱顺序
      • np.random.permutation([1,2,3,4,5])
    • df22.take([1,0,2,3])
      • 行排序
        • 指定行顺序
    • df22.take([1,0,2,3,4],axis=1)
      • 指定列顺序
    • 模拟无放回抽样,不会拿到重复数据,依次拿去
      • df22.take(np.random.permutation([0,1,2,3]))
      • permutation打乱顺序,take按照指定顺序排列
    • 模拟有放回抽样,取完一个之后,可能再次抽到相同的数据
      • df22.take(np.random.randint(0,4,size=10))
  • 数据聚合

    • 概述
      • 数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值
      • 数据分类处理
        • 分组:先把数据分为几组
        • 用函数处理:为不同组的数据应用不同的函数以转换数据
        • 合并:把不同组得到的结果合并起来
      • 数据分类处理的核心: groupby()函数
    • df.groupby(by='color')
      • 得到分组对象
    • df.groupby(by='color').groups
      • 得到分组情况
    • df.groupby(by='color').sum()
    • df.groupby(by='color').mean()
  • 高级数据聚合

    • apply
      • apply()里面可以跟自定义的函数,包括简单的求和函数以及复杂的特征间的差值函数等
      • apply不能直接使用例如sum、max、min、’count‘等方法
        • df.groupby('color')[['price']].apply(sum)
      • transform
        • transform() 里面不能跟自定义的特征交互函数
        • 它只能对每一列进行计算,所以在groupby()之后,transform()之前是要指定要操作的列
        • 如果与groupby()方法联合使用,需要对值进行去重
        • df.groupby('color')[['price']].transform(sum)
  • 用索引合并

    • ddd1.merge(ddd2,left_index=True,right_index=True)

读取数据

  • pd.read_csv('../data/SMSSpamCollection',sep='\t',header=None)
  • df = pd.read_table('../data/SMSSpamCollection',header=None)
上一篇:pandas 级联 追加 合并 pd.concat| pd.append| pd.merge


下一篇:Numpy简介