• 2.Pandas数据预处理


    2.1 数据清洗

    titanic数据为例。

    df = pd.read_csv('titanic.csv')

    2.1.1 缺失值

    (1)缺失判断

    df.isnull()

    (2)缺失统计

    1. # 列缺失统计
    2. df.isnull().sum(axis=0)

    1. # 行缺失统计
    2. df.isnull().sum(axis=1)

    1. # 统计缺失率
    2. df.isnull().mean(axis=0)

    (3)缺失删除

    1. # 删除有缺失值的行
    2. df.dropna(axis=0)
    3. # 删除有缺失值的列
    4. df.dropna(axis=1)
    5. # 删除至少有两个缺失值的行
    6. df.dropna(thresh=2)
    7. # 指定判断缺失值的列范围
    8. df.dropna(subset=['Survived','Pclass'])
    9. # 指定某列的缺失值删除
    10. df['Sex'].dropna()

    (4)缺失筛选

    1. # 筛选有缺失值的行
    2. df.loc[df.isna().any(1)]
    3. # 筛选有缺失值的列
    4. df.loc[:,df.isna().any()]
    5. # 查询没有缺失值的行
    6. df.loc[~(df.isna().any(1))]
    7. # 查询没有缺失值的列
    8. df.loc[:,~(df.isna().any())]
    9. ### 筛选缺失率大于0.7的列
    10. # 设置缺失率阈值
    11. cutoff = 0.7
    12. cond = df.isnull().mean(axis=0) > 0.7
    13. # 缺失率>0.7的变量
    14. drop_list = [k for k,v in cond.to_dict().items() if v==True]
    15. # 缺失率<=0.7的变量
    16. keep_list = [k for k,v in cond.to_dict().items() if v==False]
    17. # 缺失率大于0.7的列
    18. df[drop_list]
    19. # 缺失率小于0.7的列
    20. df[keep_list]

    (5)缺失填充

    1. ### fillna()函数填充
    2. # 将所有缺失值填充为0
    3. df.fillna(0)
    4. # 将缺失值填充为指定字符
    5. df.fillna('x')
    6. # 指定字段填充,此处用均值
    7. df.Age.fillna(df['Age'].mean())
    8. # 只替换一个 df.fillna(0, limit=1)
    9. ### replace()函数填充
    10. # 将指定列的空值替换成指定值
    11. df.replace({'Age':{np.nan:df['Age'].mean()}})
    12. ### mask()函数替换
    13. tc = df['Age'].mean()
    14. cond = df['Age'].isnull()==True
    15. df['Age'] = df['Age'].mask(cond, tc)
    16. ### interpolate()插值填充
    17. df.Age.interpolate()         #默认线性插值

    2.1.2 重复值

    (1)重复查询

    df.duplicated(subset=['name', 'birthday'], keep='first')   # 按姓名和生日查询,除第一个重复值以外的其余重复值都被筛选出来

    (2)重复统计

    1. # 对user列查重并统计重复数量
    2. df.duplicated(subset=['user'], keep=False).sum(axis=0)      # keep=False所有重复值都被筛选出来
    3. # 对user列查重并统计重复率
    4. df.duplicated(subset=['user'], keep=False).mean(axis=0)

    (3)重复删除

    1. # 对全部列去重,在原数据frame上生效
    2. df.drop_duplicates(inplace=True)
    3. # 对user列去重,在原数据frame上生效
    4. df.drop_duplicated(subset=['user'], inplace=True)
    5. # 对user、hobby列去重,保留最后一个重复行
    6. df.drop_duplicated(subset=['user','hobby'],keep='last',inplace=True)

    (4)索引重置

    1. # 索引重置
    2. df.drop_duplicates(subset=['user'],keep='first').reset_index(drop=True)

    (5)先排序再去重

    当重复数据有排序行时,一定要对数据排序后在进行去重处理。

    1. # 排序
    2. df = df.sort_values(by=['user','price'],ascending=True).reset_index(drop=True)
    3. # 去重
    4. df = df.drop_duplicated(subset=['user'],keep='first').reset_index(drop=True)

    2.1.3 数据替换

    (1)loc/iloc赋值

    1. # 第1行第3列的数据替换为4
    2. df.iloc[0:1,2:3] = 4
    3. # 将Age均值替换空值
    4. df.loc[(df['Age'].isnull()==True), 'Age'] = df['Age'].mean()
    5. # 将Pclass3以上替换为'3+'
    6. df['Pclass'] = df['Pclass'].astype(str) df.loc[(df['Pclass']>=3), 'Pclass'] = '3+'

    (2)replace替换

    1. ### 指定值替换
    2. # 数值替换
    3. s.replace(to_replace=0, value=5)
    4. # 字符替换
    5. df.replace(to_replace='S', value='C')
    6. # 空值替换
    7. df.replace(to_replace='.', value=np.nan)
    8. # 列表一一替换
    9. df.replace(to_replace=[0,1,2,3,4], value=[4,3,2,1,0])
    10. # to_replace为字典时
    11. s.replace(to_replace={0:10, 1:100})        # 此时按字典映射进行替换,value不再指定替换值 df.replace(to_replace={'Age':0.42,'Pclass':2}, value=18)       # 此时字典键为列名,值为被替换值,value为替换值
    12. df  = df.replace(to_replace={'Age':{0.42,18, 0.67:18}})        # 作为嵌套字典,指定将某列中的具体数据按字典映射替换,value不再指定替换值
    13. ### method替换
    14. # 将1,2 替换为它们前一个值
    15. s.replace([1,2], method='ffill')
    16. # 将1,2替换为它们后一个值
    17. s.replace([1,2], method='bfill')
    18. ### 正则表达式替换
    19. # 将Futrelle开头的值替换为FAA
    20. df.replace(to_replace=r'^Futrelle.*',value='FAA',regex=True)
    21. # 多个规则均替换为同样的值
    22. df.replace(regex=[r'^Futrelle.*', r'Braund.*'], value='FAA').head()
    23. # 多个正则级对应的替换内容
    24. df.replace(regex={r'^Futrelle.*':'FAA', r'^Braund.*':'BAA'})

    2.2 文本处理

    主要是针对series.str.func的应用。

    2.2.1 文本格式

    (1)大小写变换

    1. # 字符全部变成小写
    2. s.str.lower()
    3. # 字符全部大写
    4. s.str.upper()
    5. # 每个单词首字母大写
    6. s.str.title()
    7. # 字符串第一个字母大写
    8. s.str.capitalize()
    9. # 大小写字母转换
    10. s.str.swapcase()

    (2)格式判断

    1. s.str.isalpha      # 是否为字母
    2. s.str.isnumeric    # 是否为数字0-9
    3. s.str.isalnum      # 是否由字母和数字组成
    4. s.str.isupper      # 是否为大写
    5. s.str.islower      # 是否为小写
    6. s.str.isdigit      # 是否为数字

    (3)文本对齐

    1. # 居中对齐,宽度为8,其余用*填充
    2. s.str.center(8, fillchar='*')
    3. # 左对齐,宽度为8,其余用*填充
    4. s.str.ljust(8, fillchar='*')
    5. # 右对齐,宽度为8,其余用*填充
    6. s.str.rjust(8, fillchar='*')
    7. # 自定义对齐方式,参数可调整宽度,对齐方向,填充字符
    8. s.str.pad(width=8, side='both', fillchar='*')

    (4)计数编码

    1. s.str.count('b')          # 字符串中包括指定字母的数量
    2. s.str.len()               # 字符串长度
    3. s.str.encode('utf-8')     # 字符编码
    4. s.str.decode('utf-8')     # 字符解码

    2.2.2 文本拆分

    1. # 使用方法
    2. s.str.split('x', n=1)
    3. # 举例
    4. df.Email.str.split('@')
    5. # expand=True   可以让拆分的内容扩展成单独一列
    6. df.Email.str.split('@', expand=True)
    7. # 同时通过@和.进行拆分成三部分
    8. df.Email.str.split('@|\.', expand=True)

    2.2.3 文本替换

    (1)replace替换

    1. # 将email种的com都替换为cn
    2. df.Email.str.replace('com', 'cn')
    3. # 将@之前的名字都替换为xxx
    4. df.Email.str.replace('(.*?)@', 'xxx@')
    5. # 将替换内容传递给lambda隐函数实现字符大写功能
    6. df.Email.str.replace('(.*?)@', lambda x:x.group().upper())

    (2)切片替换

    df.Email.str.slice_replace(start=1, stop=2, repl='XX')

    (3)重复替换

    df.name.str.repeat(repeats=2)

    2.2.4 文本拼接

    (1)单Series序列拼接

    1. # name列series直接拼接
    2. df.name.str.cat()
    3. # 设置sep分隔符为'-'
    4. df.name.str.cat(sep='-')
    5. # 将缺失值设置为*
    6. df.name.str.cat(sep='-', na_rep='*')

    (2)多series序列拼接

    1. # 设置others后,cat会将series和others定义的序列进行拼接
    2. df.name.str.cat(others=['*']*6)
    3. # 多列拼接
    4. df.name.str.cat([df.Email, df.level], sep='-', na_rep='*')

    2.2.5 文本提取

    1. # extrac
    2. df.Email.extract(pat='(,*?)@(.*).com')
    3. # extractall多返回一列match
    4. df.Email.extractall(pat='(,*?)@(.*).com')

    2.2.6 文本查询

    1. ### find:返回原字符串的位置,没有返回-1
    2. df.Email.str.find('@')
    3. ### findall:支持正则表达式
    4. df.Email.str.findall('(,*?)@(.*).com')

    2.2.7 文本包含

    配合loc用于查询。

    df.loc[df.Email.str.contains('com|Mike', na=False)]

    2.2.8 文本哑变量

    df.name.str.get_dummies()

    2.3 时间处理

    2.3.1 时间类型

    Timestamp

    最基础的时间类,表示某个确切的时间点。在绝大多数的场景中的时间数据都是Timestamp形式的事件类型

    Period

    表示单个时间跨度,或者某个时间段,例如某一天,某一小时等。

    Timedelta

    Timedelta表示不同单位的时间,例如1天、1.5小时、3分钟、4秒等,并非具体的某个时间段。

    DatetimeIndex

    一组Timestamp构成的index

    PeriodtimeIndex

    一组Period构成的index

    TimedeltaIndex

    一组Timedelta构成的index

    1. ### 创建方式
    2. # 时间戳创建
    3. pd.Timestamp(1990,1,1)
    4. # 时间差创建
    5. pd.Timedelta('1days 1minute')
    6. # 时间周期创建
    7. pd.Period(2023, freq='M')

    2.3.2 时间类型转换

    (1)to_datetime

    1. df = pd.to_datetime(df)
    2. df['a'] = pd.to_datetime(df['a'], format='%Y.%m.%d')

    (2)to_timedelta

    pd.to_timedelta(['1days 1minute', '2days 2minute'])

    2.3.2 时间类型属性

    (1)Timestamp

    可以实现时间信息的提取、判断、格式变换。

    1. # 属性
    2. s.dt.date          # 转换为object类型的日期
    3. s.dt.year
    4. s.dt.quarter       # 季节
    5. s.dt.month
    6. s.dt.hour
    7. s.dt.minute
    8. s.dt.second
    9. s.dt.nanosecond    # 纳秒
    10. s.dt.weekday       # 工作日第几天
    11. s.dt.day           # 一个月当中的第几日
    12. s.dt.day_of_week   # 一周中第几天
    13. s.dt.day_of_year   # 一年中第几天
    14. s.dt.dayofweek
    15. s.dt.dayofyear
    16. s.dt.days_in_month # 时间所在月份总天数
    17. s.dt.daysinmonth
    18. s.dt.is_month_start          # 是否为月初
    19. s.dt.is_month_end            # 是否为月末
    20. s.dt.is_quarter_start        # 是否为季度第一天
    21. s.dt.is_quarter_end          # 是否为季度最后一天
    22. s.dt.is_year_start         
    23. s.dt.is_year_end
    24. s.dt.is_leap_year            # 是否为闰年
    25. s.dt.time                    # 获取时分秒的具体时间
    26. s.dt.timetz                  # 获取时分秒的具体时间+时区
    27. s.dt.freq                    # 频率
    28. s.dt.unit                    # 时间最小单位
    1. # 函数
    2. s.dt.as_unit('s')              # 转换最小单位精度
    3. s.dt.ceil(freq='d')            # 按指定频率向上取整
    4. s.dt.floor(freq='d')           # 按指定频率向下取整
    5. s.dt.round(freq='d')           # 按指定频率四舍五入
    6. s.dt.day_name()                # 时间对应的星期数,英文字符串
    7. s.dt.month_name()              # 时间对应的月份,英文字符串
    8. s.dt.normalize()               # 时间转换到midnight半夜
    9. s.dt.strftime(date_format='%Y-%M-%D')         # 转换时间格式,转换后对象为object
    10. s.dt.isocalendar()             # 日历函数,返回三个字段:年、一年中第几周、一周中第几天
    11. s.dt.to_period()               # 转换为period类型
    12. s.dt.to_pydatetime()           # 以numpy array形式返回Python中定义的时间差类型对象

    (2)TimeDelta

    1. # 函数
    2. s.dt.as_unit('s')              # 转换最小单位精度
    3. s.dt.ceil(freq='d')            # 按指定频率向上取整
    4. s.dt.floor(freq='d')           # 按指定频率向下取整
    5. s.dt.round(freq='d')           # 按指定频率四舍五入
    6. s.dt.day_name()                # 时间对应的星期数,英文字符串
    7. s.dt.month_name()              # 时间对应的月份,英文字符串
    8. s.dt.normalize()               # 时间转换到midnight半夜
    9. s.dt.strftime(date_format='%Y-%M-%D')         # 转换时间格式,转换后对象为object
    10. s.dt.isocalendar()             # 日历函数,返回三个字段:年、一年中第几周、一周中第几天
    11. s.dt.to_period()               # 转换为period类型
    12. s.dt.to_pydatetime()           # 以numpy array形式返回Python中定义的时间差类型对象
    1. # 函数
    2. s.dt.as_unit('s')          # 转换最小单位精度
    3. s.dt.ceil(freq='d')        # 按指定频率向上取整
    4. s.dt.floor(freq='d')      # 按指定频率向下取整
    5. s.dt.round(freq='d')      # 按指定频率四舍五入
    6. s.dt.to_pytimedelta()      # 以numpy array形式返回Python中定义的时间差类型对象
    7. # 将时间差的成分进行分解,并转化为具体的数值
    8. s.dt.components
    9. # 转换为以秒单位的数值
    10. s.dt.total_seconds()

    (3)Period

    1. # 属性
    2. df.dt.day                # 每个周期的天数
    3. df.dt.day_of_week        # 一周中的第几天
    4. df.dt.day_of_year        # 一年中的第几天
    5. df.dt.dayofweek
    6. df.dt.dayofyear
    7. df.dt.days_in_month      # 一月中的第几天
    8. df.dt.daysinmonth
    9. df.dt.start_time          # 一个周期的开始时间
    10. df.dt.end_time            # 一个周期的结束时间
    11. df.dt.is_leap_year        # 所在年是否为闰年
    12. df.dt.freq                # 频率
    13. df.dt.year                # 时间所在年
    14. df.dt.quarter            # 时间所在季节
    15. df.dt.month
    16. df.dt.week
    17. df.dt.hour
    18. df.dt.weekday            # 时间所在一周中的第几天
    19. df.dt.weekofyear          # 时间在一年中的第几周
    20. # 函数
    21. df.dt.to_timestamp()      # 转换为时间戳类型
    22. df.dt.asfreq(freq='Q')    # 改变周期频率为季度
    23. df.dt.striftime(date_format='%Y-%m-%d')        # 改变时间格式

  • 相关阅读:
    智慧金融新视野:银行数据中心可视化大屏的崛起
    C语言--程序环境和预处理(宏)
    狂神说Go语言学习笔记(二)
    读书记录 《你想活出怎样的人生》
    第3章-指标体系与数据可视化-3.1.2-Seaborn绘图库
    每周都知道|工业互联网领域热点资讯 (10月2期)
    计算机毕业设计Java动漫论坛系统(源码+系统+mysql数据库+lw文档)
    hexo 博客插入本地图片时遇到的坑
    JedisPool
    Web前端:所有新前端开发人员应该具备的顶级技能
  • 原文地址:https://blog.csdn.net/PyDarren/article/details/134469854