数据仓库与数据挖掘实验练习6-7(实验四2024.5.22)

news2024/9/21 6:20:10

tips:

列出虚拟环境:conda env list

激活虚拟环境:activate hi

进入jupyter-lab:jupyter lab

练习6

1. 处理字符串空格

  • 发现问题: 使用 values 属性查看数据时,如果发现 Name 列没有对齐,很可能是 Name 左右存在空格。
  • 确认问题: 使用 inspection['Name'].values 查看 Name 列的值,确认是否存在空格。
  • 解决问题:
    • 使用 str 属性访问字符串方法: inspection['Name'] = inspection['Name'].str.strip()
    • lstrip(): 去掉字符串左边空格
    • rstrip(): 去掉字符串右边空格
    • strip(): 去掉字符串两边空格
  • 覆盖原数据: 使用 inspection['Name'] = inspection['Name'].str.strip() 将处理后的数据覆盖原数据,并再次使用 values 属性查看,确认空格已被去除。

2. 对所有列的字符串去空格

  • columns 属性: 使用 df.columns 查看 DataFrame 的所有列名。
  • 迭代处理: columns 属性返回的是一个可迭代的 Index 对象,可以使用循环对每个列进行处理。
    for column in df.columns:
        df[column] = df[column].str.strip()
    

3. 大小写转换

  • str.lower(): 将字符串转换为小写。
  • str.upper(): 将字符串转换为大写。
  • capitalize(): 将字符串首字母大写,其余字母小写。
  • title(): 将字符串中每个单词的首字母大写,其余字母小写。

4. 提取每行 Risk 的数字

  • unique(): 可以用于检查某一列中有哪些不同的值,方便我们了解数据的结构,例inspections['Risk'].unique()

16a7bbc6d6984883985a0271ce84a44e.png

1. "All":

  • All 表示所有风险等级都适用,它是一个特殊的类别,不同于 "High", "Medium", "Low" 等具体等级。
  • 在数据分析中,你需要根据具体情况决定如何处理 All
    • 保留: 如果 All 有其特殊含义,可以将其作为单独的类别进行分析。
    • 替换: 可以根据上下文将 All 替换为更具体的风险等级,例如,如果所有风险等级都适用,可以将其替换为 "High"。
    • 删除: 如果 All 没有提供额外信息,可以将其从数据中删除。

2. "nan":

  • nan 代表缺失值,表示该数据点没有记录风险等级信息。
  • 处理 nan 的方法有很多:
    • 删除: 最简单的处理方法是删除包含 nan 的行,但可能会损失信息。
    • 填充: 可以用其他值填充 nan,例如:
      • 众数填充: 用最常见的风险等级填充。
      • 均值填充: 如果是数值型风险等级,可以使用均值填充。
      • 模型预测: 可以使用机器学习模型预测缺失的风险等级。
    • 保留: 在某些情况下, nan 本身也包含信息,可以将其作为单独的类别进行分析。
  • 正则表达式: 使用 str.extract() 方法,结合正则表达式可以高效地提取数字。

    df['Risk_Num'] = df['Risk'].str.extract(r'(\d+)') 
    

#删除nan数据,保持格式一致
inspections = inspections.dropna(subset=['Risk'])

# 替换数据
inspections = inspections.replace(to_replace='All', value='Risk 4 (Extreme)')

5. 替换数据

  • replace(): 用于替换数据,可以替换单个值或多个值。

    # 替换单个值
    df['Risk'] = df['Risk'].replace('Low', '低')
    
    # 替换多个值
    df['Risk'] = df['Risk'].replace({'Low': '低', 'High': '高'})
    

6. 提取 Risk 中的数字(切片操作)

8214a7fc210e40b3a6424dbbe2cdbd65.png

3a716adea133413f8284e541e4891446.png

  • slice(): 用于提取字符串的一部分,可以通过索引或切片语法实现。
  • inspections['Risk'].str.slice(5, 6)
  • inspections['Risk'].str[5:6]
    • 提取 "high"、"medium"、"low"、"all":
      df['Risk_Level'] = df['Risk'].str.slice(start=0, stop=-4) 
      
    • 去括号:
      df['Risk_Level'] = df['Risk_Level'].str.strip('()')
      

7. 提取包含特定数据的行

93d5eda5cf42493f884f2ad705148e7d.png

  • str.contains(): 用于判断字符串是否包含某个子字符串,返回布尔值。可以结合布尔索引提取包含特定数据的行。

    # 提取包含 "High" 的行
    high_risk = df[df['Risk'].str.contains("High")] 
    

8. 找出以特定字符串开头/结尾的数据

  • str.startswith(): 判断字符串是否以某个子字符串开头,返回布尔值。

  • str.endswith(): 判断字符串是否以某个子字符串结尾,返回布尔值。

    # 提取以 "Low" 开头的 Risk 数据
    low_start = df[df['Risk'].str.startswith("Low")]
    
    # 提取以 "(1)" 结尾的 Risk 数据
    risk_1 = df[df['Risk'].str.endswith("(1)")]
    

c9ed3d063ec44ffd9f3f4e3f35d94f3a.png

4fe1ae3cc9a1475dbd315bc50b39208b.png

9. str.len()

  • 用于获取字符串的长度。

    # 获取 Risk 列字符串长度
    df['Risk_Length'] = df['Risk'].str.len()
    

10. 字符串处理(按 "-"、" " 等方式划分)

  • str.split(): 用于根据指定分隔符分割字符串,返回一个列表。

    • split(): 默认按空格分割。
    • split(pat=" "): 按空格分割。
    • split(pat=" ", n=1): 按空格分割,最多分割一次。
    # 按空格分割 Risk 列
    df['Risk_Parts'] = df['Risk'].str.split()
    
    # 按 "-" 分割,最多分割一次
    df['Risk_First_Part'] = df['Risk'].str.split("-", n=1)
    
    # 提取First name
    # 从每行的分割后的list中按照list的index提取
    customers['Name'].str.split(' ', n=1).str.get(0)
    
    
    # 通过get(index)获取list中指定index处的值
    # 获取last name
    customers['Name'].str.split(' ', n=1).str.get(1)
    
    # 将 split 后的多个部分分别作为列
    # 返回DataFrame
    customers['Name'].str.split(pat=' ', n=1, expand=True)
    
    # 如果没有控制 split 后得到的 list 的长度
    # pandas 会自动取最长的len(list), 且缺失值处显示 None
    customers['Name'].str.split(pat=' ', expand=True)

11.给原来的DataFrame添加新列

# 把Name拆为1 、 2
customers[
['Name1','Name2']
] = customers['Name'].str.split(pat = ' ', n = 1, expand=True)

1f12cefd7e0246719127cfe959c8afc6.png

f74b696fa8cd41dc82101fc7f62925df.png

 

 练习题

# customers.csv包括一个地址列。
# 每个地址由一条街道、城市、州和邮政编码组成。
# 分离这四个值;
# 将它们分配到DataFrame中新的Street、City、State和Zip列;
# 然后删除地址列。

customers

customers['Address'].values

split_Address = customers['Address'].str.split(', ', expand=True)
split_Address

customers[['Street', 'City', 'State', 'Zip']] = split_Address
customers = customers.drop(labels='Address', axis='columns')
customers

练习7

MultiIndex

MultiIndex(多级索引) 允许使用多个索引级别来组织数据,从而创建出层次化的数据结构。 这使得数据的分析和操作更加灵活和强大。

1. 创建

创建 MultiIndex 的方法有很多:

  • from_tuples: 从元组列表创建 MultiIndex

import pandas as pd

tuples = [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

data = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
print(data)
  • from_arrays: 从数组列表创建 MultiIndex

arrays = [[1, 1, 2, 2], ['a', 'b', 'a', 'b']]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])

data = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
print(data)
  • from_product: 从多个迭代器创建 MultiIndex

iterables = [[1, 2], ['a', 'b']]
index = pd.MultiIndex.from_product(iterables, names=['first', 'second'])

data = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
print(data)

2. 访问数据

使用 MultiIndex 可以更方便地访问和操作数据:

  • loc: 使用标签进行访问

# 获取 first 为 1,second 为 'a' 的数据
print(data.loc[(1, 'a')])

# 获取 first 为 1 的所有数据
print(data.loc[1])

# 获取 second 为 'a' 的所有数据
print(data.loc[:, 'a'])
  • iloc: 使用位置进行访问

# 获取第一行数据
print(data.iloc[0])

# 获取前两行数据
print(data.iloc[:2])
  • xs: 访问特定级别的值

# 获取 first 为 1 的所有数据
print(data.xs(1, level='first'))

# 获取 second 为 'a' 的所有数据
print(data.xs('a', level='second'))

3. 数据操作

MultiIndex 允许对数据进行更灵活的操作:

  • 排序: 可以根据不同级别的索引进行排序

# 根据 first 级别升序排序
print(data.sort_index(level='first'))

# 根据 second 级别降序排序
print(data.sort_index(level='second', ascending=False))
  • 分组: 可以根据不同级别的索引进行分组

# 根据 first 级别进行分组
grouped = data.groupby(level='first')

# 计算每个组的平均值
print(grouped.mean())
  • 切片: 可以根据不同级别的索引进行切片

# 获取 first 级别为 1 的所有数据
sliced = data.loc[1]

# 获取 second 级别为 'a' 的所有数据
sliced = data.loc[:, 'a']

排序

facdf12ace444c47bd7f7a649a8645aa.png

查询

可以理解为数据降维

15f41e7968854c239e23f62664e3f294.png

4665726472bb489fb22aa144379f6ff8.png

import pandas as pd

address = ('8890 Flair Square', 'Toddside', 'IL', '37206')
address

address = [
    ("8809 Flair Square", "Toddside", "IL", "37206"),
    ("9901 Austin Street", "Toddside", "IL", "37206"),
    ("905 Hogan Quarter", "Franklin", "IL", "37206"),
]

pd.MultiIndex.from_tuples(tuples=address)

# 给每个level取个名字
row_index = pd.MultiIndex.from_tuples(
    tuples=address, names=['Street', 'City', 'State', 'Zip'])
row_index

# 使用MultiIndex创建DataFrame
# 对 DataFrame 的行使用 MultiIndex
data = [
    ['A', 'B+'],
    ['C+', 'C'],
    ['D-', 'A']
]
columns = ['Schools' ,'Cost of Living']
area_grades = pd.DataFrame(
    data=data, index=row_index, columns=columns
)

area_grades

area_grades.columns

area_grades.index

# 对 DataFrame 的列使用 MultiIndex
column_index = pd.MultiIndex.from_tuples(
    [
        ("Culture", "Restaurants"),
        ("Culture", "Museums"),
        ("Services", "Police"),
        ("Services", "Schools"),
    ]
)
column_index

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1696877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年软考总结 信息系统管理师

选择题 英文题,我是一题也没把握,虽然我理解意思。 千万不要认为考死记硬背不对。目的不在于这。工程项目中有很多重要的数字,能记住说明你合格。 案例 几乎把答案全写在案例中了。 计算题 今年最简单。没有考成本。 只考了关键路径&a…

sheng的学习笔记-AI-EM算法

AI学习笔记目录:sheng的学习笔记-AI目录-CSDN博客 目录 基础知识 什么是EM算法 EM算法简介 数学知识 极大似然估计 问题描述 用数学知识解决现实问题 最大似然函数估计值的求解步骤 Jensen不等式 定义 EM算法详解 问题描述 EM算法推导流程 EM算法流程…

绘制t-SNE图

什么是t-SNE图? 如下图,下图来源于论文Contrastive Clustering 一般用于分类问题/对比学习。 作用? 体现出经过层层训练,类内越来越紧密,类间差异越来越大;或者也可以做消融可视化。 怎么画&#xff1f…

如何安装虚拟机Wmware,并且在虚拟机中使用centos系统

1. 前言 大家好,我是jiaoxingk 本篇文章主要讲解如何安装虚拟机,并且在虚拟机中安装centos系统,让windows电脑也能够使用Linux系统 2. 虚拟机的介绍 在安装Vmware之前,我们先做虚拟机的介绍 虚拟机:通过软件虚拟出来的…

【吊打面试官系列】Java高并发篇 - 什么是乐观锁和悲观锁?

大家好,我是锋哥。今天分享关于 【什么是乐观锁和悲观锁?】面试题,希望对大家有帮助; 什么是乐观锁和悲观锁? 1、乐观锁: 就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态, 乐观锁认为竞争…

JAVAEE初阶多线程(4)

在前面的文章中简单的概述了线程的基本定义接下来就是线程的最后完结了。 1.工厂模式 1.1工厂模式的简单定义 (1)在java jar包中有一个工厂模式这是一种设计模式 (2)这个设计模式是为了更好的解决构造方法创建对象太坑了的问题…

安卓开发:相机水印设置

1.更新水印 DecimalFormat DF new DecimalFormat("#"); DecimalFormat DF1 new DecimalFormat("#.#");LocationManager LM (LocationManager)getSystemService(Context.LOCATION_SERVICE); LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2…

urllib_post请求_百度翻译之详细翻译

百度翻译有一个详细翻译的接口: post请求: 请求参数(较多): 打印之后,发现有问题: 改一下请求头: 将Accept-Encoding注释掉,因为我们使用的是utf-8编码: 加上…

解决:LVGL+GUI Guider 1.7.2运行一段时间就会卡死死机,内存泄露溢出的问题

概括: 我在使用NXP官方GUI Guider生成的代码出现了内存泄漏的问题。但我遇到的并不是像其他人所说的style的问题,如下链接。而是因为在页面渲染之前就使用了该页面内的组件,内存就会不断增加。 LVGL 死机 内存泄漏_lvgl 内存溢出-CSDN博客 运…

..堆..

堆 堆是完全二叉树,即除了最后一列之外,上面的每一层都是满的(左右严格对称且每个节点都满子节点) 最后一列从左向右排序。 默认大根堆:每一个节点都大于其左右儿子,根节点就是整个数据结构的最大值 pr…

【Telemac】Telemac相关报错记录

文章目录 1.下载BlueKenue后缀为man解决办法2.运行Telemac项目提示Fortran报错解决办法1.下载BlueKenue后缀为man BlueKenue官方下载链接: 可以看到下载器请求时出现了问题,下载BlueKenue后缀为man. 解决办法 修改下载后的文件后缀为msi即可 2.运行Telemac项目提示Fortr…

视频号小店怎么进入优选联盟?入驻优选联盟都有什么条件?

大家好,我是电商花花。 视频号小店想要出单、爆单,不管在流量上还是销量都离不开达人带货,因为目前视频号小店上基本上就没有自然流量,想出单只能做达人带货。 而视频号小店想要找达人带货,必须是企业店铺&#xff0…

C++基础与深度解析 | 泛型算法 | bind | Lambda表达式

文章目录 一、泛型算法1.泛型算法的分类2.迭代器分类 二、bind与lambda表达式1.bind2.lambda表达式 三、泛型算法的改进--ranges(c20) 一、泛型算法 C中的泛型算法是标准模板库(STL)的一部分(这里重点讨论 C 标准库中定义的算法,而…

转置卷积简明教程

转置卷积层也被(错误地)称为反卷积层。反卷积层反转了标准卷积层的操作,即如果对通过标准卷积层生成的输出进行反卷积,则会返回原始输入。转置卷积层与反卷积层相似,因为两者生成的空间维度相同。转置卷积不是通过值反…

【闲聊】-Chrome DevTools简介与启动方法

Chrome DevTools简介与启动方法 Chrome DevTools是Chrome浏览器内置的一套网页开发调试工具,适用于前端开发人员。以下是如何启动DevTools以及各个面板的功能列表。 如何启动Chrome DevTools 快捷键启动: 在Windows/Linux上,按 F12 或 Ctrl…

1.手动LogisticRegression模型的训练和预测

通过这个示例,可以了解逻辑回归模型的基本原理和训练过程,同时可以通过修改和优化代码来进一步探索机器学习模型的训练和调优方法。 过程: 生成了一个模拟的二分类数据集:通过随机生成包含两个特征的数据data_x,并基于一定规则生…

博客说明 5/12~5/24【个人】

博客说明 5/12~5/24【个人】 前言版权博客说明 5/12~5/24【个人】对比最后 前言 2024-5-24 13:39:23 对我在2024年5月12日到5月24日发布的博客做一下简要的说明 以下内容源自《【个人】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作…

从浮点数定义到FP8: AI模型中不同的数据类型

背景:AI模型中不同的数据类型对硬件算力和内存的需求是不同的,为了提高模型在硬件平台的吞吐量,减少数据通信带宽需求,往往倾向于将高位宽数据运算转向较低位宽的数据运算。本文通过重新回顾计算机中整数和浮点数的定义&#xff0…

SQL面试题练习 —— 连续支付订单合并

目录 1 题目2 建表语句3 题解 1 题目 现有一张用户支付表:t_user_pay 包含字段订单ID,用户ID,商户ID,支付时间,支付金额。 如果同一用户在同一商户存在多笔订单,且中间该用户没有其他商户的支付记录&#…

JMeter学习笔记二

面试题: 1.做接口测试时,你是怎么做的数据校验(返回值验证)?一般你会验证哪些数据? 校验code 200(说明后端接到了你的请求,并且给了应答) 返回信息 sucess 2.有1w个用户名密码需要登录&#xff…