• pandas-数据处理


    pandas数据处理

    1、删除重复元素

    重复行判断

    df.duplicated() # 重复行 显示为True,其他False (重复行第一次出现不为重复)

    • keep : 默认first 从前往后看, last 从后往前看 (重复出现的行)

    • subset=['B','C','D'] 默认对整行判断, 可指定列索引 # 表示有B, C, D重复的行,显示True

    删除重复行

    df.drop_duplicates() # 删除重复行

    df[df.duplicated()] # 显示重复行数据

    df[np.logical_not(df.duplicated())] 显示不重复的行数据 # 方法1

    df[~df.duplicated()] # 方法2 取反

     

    2. 映射

    映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定

    需要使用字典:

    包含三种操作:

    • replace()函数:替换元素

    • 最重要:map()函数:新建一列

    • rename()函数:替换索引

    (1) replace()函数:替换元素

    dic = {10:100,4:104,6:106}

    ddd.replace(dic)   # 将DataFrame中 10,4,6 替换为字典中映射的数据100,104,106

    ddd.replace([10,6], method='ffill', limit=1)   # 指定替换方式

    替换NaN元素

    ddd = ddd.astype(np.float64)
    ddd.iloc[0,1] = np.nan
    ddd.replace({np.nan:0.0})

    (2) map()函数:新建一列

    • 使用map()函数,由已有的列生成一个新列, 适合处理某一单独的列。

    • 仍然是新建一个字典, map()函数中可以使用lambda函数

    传一个映射的字典

    df['python'] = df['语文'].map({72:100,107:110,28:120}) # 由已有的列生成一个新列

    map()函数中可以使用lambda函数

    df['java'] = df['英语'].map(lambda x:x*2)

    传一个自定义函数

    def score(s):
      if s<90:
          return 'failed'
      elif s>120:
          return 'excellent'
      else:
          return 'pass'
    df['English_score'] = df['英语'].map(score)

    可以修改已有数据

    df['数学'] = df['数学'].map({55:100, 66:120, 77:130})

    transform()和map()类似

    df['php'] = df['英语'].transform(lambda x:x*2)

    区别: map() 一次传递一个数据,传完一列; transform 传递整个列

    (3) rename()函数:替换索引

    仅传字典,需指定axis

    df.rename({'张三':'张十三','李四':'李十四','王五':'王老五'},axis=1)

    替换行索引

    df.rename(index = {'张三':'张十三','李四':'李十四','王五':'王老五'})

    替换列索引

    df.rename(columns={'语文':'chese','数学':'math','英语':'English','python':'py'})

     

    3. 异常值检测和过滤

    • 使用describe()函数查看每一列的描述性统计量

      df.describe()

      包括: count: 数据个数 mean: 平均值 std: 标准差

      min: 最小值 max: 最大值 等等

      df.info() 查看DataFrame信息

    • 使用std()函数可以求得DataFrame对象每一列的标准差

    • 根据每一列的标准差,对DataFrame元素进行过滤。

    • 借助any()函数, 测试是否有True,有一个或以上返回True,反之返回False

    • 对每一列应用筛选条件,去除标准差太大的数据

    • 删除特定索引df.drop(labels,inplace = True), 或 df[~cond]

    # 一个形状为10000*3的标准正态分布的DataFrame(np.random.randn),去除掉所有满足以下情况的行:其中任一元素绝对值大于3倍标准差

    df = DataFrame(np.random.randn(10000,3))
    df.abs()  # 每个元素绝对值
    # 判断异常数据.
    # 去除掉所有满足以下情况的行
    # 大于三倍标准偏差
    cond = (df.abs() > df.std()*3).any(axis=1)
    df[cond]   # 存在大于三倍标准偏差元素的异常行
    df[~cond]  # 取反, 去掉异常的行

     

    4. 排序

    • 使用.take()函数排序

      df.take([3,2,1]) # 指定行排序

      df.take([2,1,0],axis=1) # 指定列排序

    • 可以借助np.random.permutation()函数随机排序

      有放回的随机抽样.

      df.take(np.random.randint(0,3,size=3))

      无放回的随机抽样.

      df.take(np.random.permutation([0,1,2]))

     

    5. 数据聚合【重点】

    数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。

    数据分类处理:

    • 分组:先把数据分为几组

    • 用函数处理:为不同组的数据应用不同的函数以转换数据

    • 合并:把不同组得到的结果合并起来

    数据分类处理的核心: groupby()函数

    1, 分组, groupby

    df.groupby(by='color')

    2, 调用聚合 函数,

    df.groupby(by='color').sum()[['price']] # 会先计算所有列

    df.groupby(by='color')[['price']].sum() # 先取列再聚合. 计算少,性能更佳, 推荐写法.

    3, 把聚合的结果追加到原始数据表.使用 pd.merge() 合并

    pd.merge(df, price_sum, left_on='color', right_index=True, suffixes=['', '_sum'])

    使用add_prefix(), add_suffix() 给聚合的数据修改列名

    df.groupby(by='color').sum()[['price']].add_prefix('mean_')

    df.groupby(by='color').sum()[['price']].add_suffix('_mean')

    可以使用transform和apply实现相同功能

    在transform或者apply中传入函数名即可

    df.groupby(by='color').sum()[['price']] .transform(sum)

    df.groupby(by='color').sum()[['price']] .apply(sum) # 会将字符串也相加

     

  • 相关阅读:
    SET TRANSACTION
    SET SESSION AUTHORIZATION
    SET CONSTRAINTS
    SET
    services
    send, sendto, sendmsg
    并列句分析
    cURL 学习笔记与总结(3)模拟登录博客园并下载个人随笔首页
    SQLServer2019安装教程
    Java实现 LeetCode 85 最大矩形
  • 原文地址:https://www.cnblogs.com/Deaseyy/p/11921636.html
Copyright © 2020-2023  润新知