• 1 重复数据
    • 2 映射
    • 2.1 replace():替换元素
    • 2.2 map():替换一列
    • 2.3 transform():数据转换
    • 2.4 rename():替换索引
    • 3 聚合操作处理异常
    • 4 排序
    • 5 数据分类/组处理
    • 6 高级数据聚合
    • 7 注意
    首先将numpy,pandas导入

    1. import numpy as np
    2. import pandas as pd
    3. from pandas import Series, DataFrame

    创建一个DataFrame对象来作为示例

    1. dic = {
    2. "name":['lucy', 'jim', 'tom', 'rose', 'jack'],
    3. "python": [100,90,89,88,98],
    4. }
    5. df = DataFrame(data=dic)

    重复数据

    1. 利用DataFrame的duplicated方法,duplicated(subset=None, keep=’first’),返回一个布尔类型的Series,显示是否有重复行,无重复的行为False,有重复行的为True
      • subset=None:用来指定特定的行,默认所有的行
      • keep=’first’:保留第一次出现的重复项,为last时,保留最后一次出现,为False时保留全部重复行
    2. 利用drop_duplicated方法,drop_duplicates(subset=None, keep=’first’, inplace=False),移除DataFrame中的重复行
      • subset=None:指定行
      • keep=’first’:删除重复项,保留第一次出现的项,为last保留最后一次重复项,为False删除全部重复项
      • inplace:为False保留副本,为True在原数据上修改
      映射
      映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
      包含三种操作:
      • replace()函数:替换元素(DataFrame\Series的函数)值的映射
      • 最重要:map()函数:新建一列(Series的函数)列的映射
      • rename()函数:替换索引(DataFrame的函数)索引映射
      replace():替换元素
      语法:replace(self, to_replace=None, value=None, inplace=False, limit=None, regex=False, method=’pad’, axis=None)
      • to_replace:需要替换的对象,str, regex, list, dict, Series, int, float, or None
      • value:替换后的值,scalar, dict, list, str, regex, default None
      • inplace:是否在原数据上执行操作,bool, default False
      • limit:替换次数,int, default None
      • regex:to_replace的参数是否时正则,bool or same types as to_replace, default False
      • method:替换方式,向前、向后替换,{‘pad’, ‘ffill’, ‘bfill’, None}
      • axis:方向
    3. Series对象替换
      获取索引为2的数据
    1. s = df.iloc[2]

    单值替换

    1. s.replace('before', 'after')
    2. s.replace({'before': 'after'})

    多值替换

    1. s.replace(['before1', 'before2'], ['after1', 'after2']) # 列表值替换
    2. s.replace({'before1': 'after1', 'before2': 'after2'}) # 字典映射值替换

    method填充方式

    1. s.replace(['before1', 'before2'], method='pad') # 向前填充
    2. s.replace(['before1', 'before2'], method='ffill') # 向前填充
    3. s.replace(['before1', 'before2'], method='bfill') # 向后填充

    limit控制次数

    1. s.replace(['before1', 'before2'], method='pad', limit=1) # 只填充第一个重复项
    1. DataFrame对象填充
      单值替换
    1. df.replace('before', 'after') # 一对一的值替换
    2. df.replace({'before': 'after'}) # 字典映射替换关系

    按列指定单值替换

    1. df.replace({'column': 'before'}, 'after') # 替换column列中的before
    2. df.replace({'column1': 'before1', 'column2': 'before2'}, 'after') # 替换两列中的两个元素值

    多值替换

    1. df.replace(['before1', 'before2', 'before3'], ['after1', 'after2', 'after3'])
    2. df.replace({'before1': 'after1', 'before2': 'after2'}) # 字典映射的替换关系
    3. df.replace({'before1', 'before2'}, {'after1', 'after2'}) # 后面的替换前面的两个值

    正则替换

    1. df.replace(r'?|.|$',np.nan,regex=True)#用np.nan替换?或.或$原字符
    2. df.replace(regex={r'?':None})

    value参数显式传递

    1. df.replace(to_replace=[150,300], value=[0,0])

    map():替换一列
    map()函数是series的函数,一般是对DataFrame的某一列进行整体的映射
    • map()可以接受一个字典
    • map()可以使用lambd表达式
    • map()可以使用自定义的方法
    • map()可以映射新一列数据
    注意
    • map()中不能使用sum之类的聚合函数、for循环
    • map(字典)字典的键要足以匹配所有的数据,否则出现NaN
    使用字典一般处理离散型的映射
    我们用key,来表示数据中存在的需要创建映射的值,value来表示主动生成的映射值

    1. df["column"].map({"key": "value"}) # 返回的是映射所在的新的一列,没有的数据填充NaN

    传入map的字典,简直比映射列的值多时,多出的值,不会报错,不会产生映射,根据这个特性,可以将所有需要映射的内容,统一整合到一个字典中

    1. map_dic = {
    2. "lucy": "ming",
    3. "jim": "Jimmy",
    4. "tom": "Tommy",
    5. "rose": "Rosey",
    6. "Tim": "Timmy"
    7. }
    8. df["name"].map(map_dic)

    map中传入函数
    传入map()中的是函数名,这个函数可以显式函数,也可以是匿名函数,传入函数后会对获取的列中的元素,挨个处理。传入函数一般处理数值型的映射
    显式函数

    1. def map_func(x):
    2. """
    3. 获取字典值,如果没有则返回传入值本身
    4. """
    5. return dic.get(x, x)

    获取df中的一列,使用显式函数,形成映射关系

    1. df["name"].map(map_func)

    或者传入一个匿名函数

    1. df["name"].map(lambda x: dic.get(x, x)) # 两个表达式的结果是一样

    需要注意的是,map()函数没有inplace属性,不能再原数据上修改,如果需要将原数据修改,或者新增加一列来接受映射值,需要定义。

    1. df["name"] = df["name"].map(map_func)

    transform():数据转换
    参数:func : function, str, list or dict。可以传入函数,函数的名字,函数名的列表,或者一个用于数据处理的字典
    transform输出的是原输入的DataFrame大小的,是经过了转换的DataFrame
    由于transform()可以接收包含几个函数的列表,所以可以返回多于原始数据长度的的数据。
    rename():替换索引
    参数说明:
    • mapper:替换所有的索引
    • index:替换行索引
    • columns:替换列索引
    • level:指定多维索引的维度
    • axis:指定操作数据的方向
    • inplace:是否再原数据上操作
    和map()函数一样,如果接收的字典参数中,右多余的数据,不会报异常。
    同时,rename()支持接受多个参数,例如rename(mapper, axis={‘index’, ‘columns’}, …)

    1. df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
    2. df.rename(index=str, columns={"A": "a", "B": "c"})