第四天打卡

@浙大疏锦行

内容一览

  1. 认识pandas库与缺失数据的补全
  2. 正则表达式

1.认识pandas库与缺失数据的补全

1.  打开数据(csv文件、excel文件)

import pandas as pd

# 指定 CSV 文件路径
file_path = "d:\\学习py\\data.csv"

try:
    # 打开 CSV 文件
    df = pd.read_csv(file_path)
    print("文件已成功打开。")
    print("数据基本信息:")
    df.info()
    # 查看数据集行数和列数
    rows, columns = df.shape
    if rows > 0 and columns > 0:
        # 打印数据集前几行
        print("数据前几行信息:")
        print(df.head().to_csv(sep='\t', na_rep='nan'))
    else:
        print("数据集中没有有效数据。")
except FileNotFoundError:
    print(f"未找到指定文件:{file_path}")
except Exception as e:
    print(f"打开文件时发生错误:{e}")

2.  查看数据(尺寸信息、查看列名等方法)

import pandas as pd

# 确保文件路径正确
file_path = "d:\\学习py\\data.csv"

try:
    # 1. 打开CSV文件
    df = pd.read_csv(file_path)
    
    # 2. 查看数据尺寸信息
    print("数据尺寸(行数, 列数):", df.shape)
    
    # 3. 查看列名
    print("\n列名列表:", df.columns.tolist())
    
    # 4. 查看前5行数据
    print("\n前5行数据预览:")
    print(df.head())
    
except FileNotFoundError:
    print(f"错误: 未找到文件 {file_path}")
except Exception as e:
    print(f"发生错误: {str(e)}")

3.  查看空值

import pandas as pd

# 确保文件路径正确
file_path = "d:\\学习py\\data.csv"

try:
    # 1. 打开CSV文件
    df = pd.read_csv(file_path)
    
    # 2. 查看数据尺寸信息
    print("数据尺寸(行数, 列数):", df.shape)
    
    # 3. 查看列名
    print("\n列名列表:", df.columns.tolist())
    
    # 4. 查看前5行数据
    print("\n前5行数据预览:")
    print(df.head())
    
    # 5. 查看空值情况
    print("\n=== 空值统计 ===")
    print("各列缺失值数量:")
    print(df.isnull().sum())
    print("\n缺失值占比(%):")
    print((df.isnull().mean() * 100).round(2))
    
except FileNotFoundError:
    print(f"错误: 未找到文件 {file_path}")
except Exception as e:
    print(f"发生错误: {str(e)}")

4.  众数、中位数填补空值

import pandas as pd

# 确保文件路径正确
file_path = "d:\\学习py\\data.csv"

try:
    # 1. 打开CSV文件
    df = pd.read_csv(file_path)
    
    # 2. 查看数据尺寸信息
    print("数据尺寸(行数, 列数):", df.shape)
    
    # 3. 查看列名
    print("\n列名列表:", df.columns.tolist())
    
    # 4. 查看前5行数据
    print("\n前5行数据预览:")
    print(df.head())
    
    # 5. 查看空值情况
    print("\n=== 空值统计 ===")
    print("各列缺失值数量:")
    print(df.isnull().sum())
    print("\n缺失值占比(%):")
    print((df.isnull().mean() * 100).round(2))
    
    # 6. 使用众数和中位数填补空值
    print("\n=== 开始填补缺失值 ===")
    for column in df.select_dtypes(include=['number']).columns:
        if df[column].isnull().any():
            # 对离散型数据使用众数填补
            if len(df[column].unique()) < 10:
                mode_val = df[column].mode()[0]
                df[column].fillna(mode_val, inplace=True)
                print(f"列 '{column}' 使用众数填补: {mode_val}")
            # 对连续型数据使用中位数填补
            else:
                median_val = df[column].median()
                df[column].fillna(median_val, inplace=True)
                print(f"列 '{column}' 使用中位数填补: {median_val}")
    
    # 7. 验证填补结果
    print("\n=== 填补后缺失值检查 ===")
    print("各列缺失值数量:")
    print(df.isnull().sum())
    
except FileNotFoundError:
    print(f"错误: 未找到文件 {file_path}")
except Exception as e:
    print(f"发生错误: {str(e)}")

5.  利用循环补全所有列的空值

import pandas as pd

# 确保文件路径正确
file_path = "d:\\学习py\\data.csv"

try:
    # 1. 打开CSV文件
    df = pd.read_csv(file_path)
    
    # 2. 填补所有列的缺失值
    print("\n=== 开始填补所有列的缺失值 ===")
    for column in df.columns:
        if df[column].isnull().any():
            # 数值型列处理
            if pd.api.types.is_numeric_dtype(df[column]):
                # 离散型用众数
                if len(df[column].unique()) < 10:
                    fill_value = df[column].mode()[0]
                    print(f"数值列 '{column}' 使用众数填补: {fill_value}")
                # 连续型用中位数
                else:
                    fill_value = df[column].median()
                    print(f"数值列 '{column}' 使用中位数填补: {fill_value}")
            # 非数值型列用众数
            else:
                fill_value = df[column].mode()[0]
                print(f"非数值列 '{column}' 使用众数填补: {fill_value}")
            
            df[column].fillna(fill_value, inplace=True)
    
    # 3. 验证填补结果
    print("\n=== 填补后缺失值检查 ===")
    print("各列缺失值数量:")
    print(df.isnull().sum())
    
    # 4. 输出补全后的数据
    print("\n=== 补全后的完整数据 ===")
    print(df)
    
except FileNotFoundError:
    print(f"错误: 未找到文件 {file_path}")
except Exception as e:
    print(f"发生错误: {str(e)}")

2.正则表达式

假设你有一个包含图片文件名的列表,每个文件名都遵循 [动物类别][数字编号].[扩展名] 的格式,例如 "cat1.jpg", "dog23.png", "bird005.gif" 等。你的任务是编写一个 Python 脚本,使用正则表达式从每个文件名中提取出动物的类别(即文件名开头部分的英文字母)。

1.  定义一个包含以下文件名的列表 filenames:

filenames = ["cat12.jpg", "dog03.png", "bird9.jpeg", "cat_007.jpg", "rabbit1.gif", "dog2.bmp"]

注意:其中有一个文件名 "cat_007.jpg" 可能不完全符合简单模式,看看你的正则表达式是否能恰当处理或忽略。

1.  导入 Python 的正则表达式模块 re。

2.  创建一个空列表 animal_categories,用于存储提取出来的动物类别。

3.  使用 for 循环遍历 filenames 列表中的每一个文件名。

4.  在循环内部:

a.  编写一个正则表达式模式,该模式能够匹配文件名开头的一个或多个连续的英文字母(作为动物类别)。提示:你可能需要用到 ^ 来确保从字符串开头匹配,并使用 () 来创建一个捕获组以提取这部分。例如,模式可以考虑匹配开头的字母 ([a-zA-Z]+)。

b.  使用 re.search() 函数尝试在当前文件名中查找匹配该模式的部分。

c.  检查 re.search() 是否找到了匹配项(即返回值不是 None)。

d.  如果找到了匹配项,使用 match.group(1) 提取第一个捕获组的内容(也就是动物类别字符串),并将其添加到 animal_categories 列表中。

e.  如果未找到匹配项(例如,对于 "cat_007.jpg",如果你的模式只匹配纯字母开头,可能就匹配不上),则不进行添加。

5.  循环结束后,使用 f-string 打印出提取到的所有动物类别列表。

打印格式应类似:

提取到的动物类别: [‘cat’, ‘dog’, ‘bird’, ‘rabbit’, ‘dog’]

import re

# 定义文件名列表
filenames = ["cat12.jpg", "dog03.png", "bird9.jpeg", "cat_007.jpg", "rabbit1.gif", "dog2.bmp"]
animal_categories = []

# 遍历所有文件名
for filename in filenames:
    # 匹配文件名开头的一个或多个字母
    match = re.search(r'^([a-zA-Z]+)', filename)
    if match:
        animal_categories.append(match.group(1))

# 打印结果
print(f"提取到的动物类别: {animal_categories}")

import re 是 Python 中导入正则表达式(Regular Expression)模块的关键语句。下面详细解释这段代码的工作原理:

1. 正则表达式模块(re) :
   
   - re 是 Python 内置的文本处理模块
   - 提供字符串搜索、匹配和替换功能
   - 支持复杂的模式匹配语法

当前代码中的正则表达式 r'^([a-zA-Z]+)' 就是专门设计用来提取文件名开头连续的字母部分,遇到数字或下划线就会停止提取。详细解释一下这个匹配规则:

1. 匹配规则 :
   
   - ^ 表示从字符串开头匹配
   - [a-zA-Z] 只匹配大小写字母
   - + 表示匹配1个或多个前面的字符(字母)
   - 遇到任何非字母字符(数字、下划线等)就会停止

# 匹配规则解释:
r'^([a-zA-Z]+)'  # 分解说明:
# r - 表示原始字符串(raw string)
# ^ - 匹配字符串开头
# [a-zA-Z] - 匹配任意大小写字母
# + - 匹配1个或多个前面的字符
# () - 创建捕获组,用于提取匹配内容

# 执行过程:
1. 遍历 filenames 列表中的每个文件名
2. 对每个文件名应用正则匹配:
   - "cat12.jpg" → 匹配"cat"
   - "dog03.png" → 匹配"dog" 
   - "cat_007.jpg" → 只匹配"cat"(遇到下划线停止)
3. 将匹配结果存入 animal_categories 列表
"cat12.jpg" → 提取 "cat" (遇到数字1停止)
"dog03.png" → 提取 "dog" (遇到数字0停止) 
"cat_007.jpg" → 提取 "cat" (遇到下划线停止)
"rabbit1.gif" → 提取 "rabbit" (遇到数字1停止)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值