内容一览
- 认识pandas库与缺失数据的补全
- 正则表达式
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停止)