题目:按照示例代码的要求,去尝试补全信贷数据集中的数值型缺失值
完整步骤:
根据步骤尝试给出代码实现:
1.打开数据(csv文件、excel文件)
import pandas as pd
data = pd.read_csv('data.csv')
详细的代码说明:
import pandas as pd # 第一步:导入工具包
data = pd.read_csv('data.csv') # 第二步:读取数据文件
详细步骤说明:
1.导入工具包 ( import pandas as pd )
- 这是Python中使用第三方库的标准方式
- pandas 是Python中最强大的数据分析库
- as pd 是给这个库起一个简称,后续使用时只需写 pd 即可
- 这行代码执行后,我们就可以使用pandas的所有功能了
2.读取数据文件 ( pd.read_csv('data.csv') )
- read_csv() 是pandas提供的专门用于读取CSV文件的方法
- 'data.csv' 是要读取的文件名(当前目录下的文件)
- 读取过程:
- 自动识别文件编码(通常是UTF-8)
- 自动解析文件中的表格结构
- 将第一行识别为列名(表头)
- 将后续行识别为数据行
- 返回一个DataFrame对象(这是pandas的核心数据结构)
3.赋值给变量 ( data = )
- 将读取得到的DataFrame对象存储在变量 data 中
- 后续可以通过这个变量名来操作数据
这段代码实际发生了什么:
Python会按照以下顺序查找文件:
1. 首先在当前工作目录(你的.ipynb文件所在目录)查找data.csv
2. 如果找不到,会报错 FileNotFoundError
学习中遇到的问题:
1. 文件不在当前目录
- 需要使用完整路径,如: data = pd.read_csv('D:/我的文档/data.csv')
2.文件是Excel格式
- 使用: data = pd.read_excel('data.xlsx')
2.查看数据(尺寸信息、查看列名等方法)
①查看数据行列数
print("数据尺寸:", data.shape)
输出的结果是:
数据尺寸: (7500, 18)
详细步骤解析:
查看数据尺寸 ( data.shape )
- shape 是DataFrame的属性,返回一个元组(行数, 列数)
- 例如输出 (1000, 20) 表示有1000行20列数据
- 这是了解数据量的最基本方法
②所有列名
print("列名:", data.columns.tolist())
输出的结果是:
列名: ['Id', 'Home Ownership', 'Annual Income', 'Years in current job', 'Tax Liens', 'Number of Open Accounts', 'Years of Credit History', 'Maximum Open Credit', 'Number of Credit Problems', 'Months since last delinquent', 'Bankruptcies', 'Purpose', 'Term', 'Current Loan Amount', 'Current Credit Balance', 'Monthly Debt', 'Credit Score', 'Credit Default']
详细步骤解析:
查看列名 ( data.columns.tolist() )
- columns 属性获取所有列名(返回Index对象)
- tolist() 将列名转换为Python列表
- 输出示例: ['姓名', '年龄', '收入', ...]
- 这有助于了解数据包含哪些字段
③查看前五行数据
print("\n前5行数据:")
print(data.head())
输出的结果是:
前5行数据:
Id Home Ownership Annual Income Years in current job Tax Liens \
0 0 Own Home 482087.0 NaN 0.0
1 1 Own Home 1025487.0 10+ years 0.0
2 2 Home Mortgage 751412.0 8 years 0.0
3 3 Own Home 805068.0 6 years 0.0
4 4 Rent 776264.0 8 years 0.0
Number of Open Accounts Years of Credit History Maximum Open Credit \
0 11.0 26.3 685960.0
1 15.0 15.3 1181730.0
2 11.0 35.0 1182434.0
3 8.0 22.5 147400.0
4 13.0 13.6 385836.0
Number of Credit Problems Months since last delinquent Bankruptcies \
0 1.0 NaN 1.0
1 0.0 NaN 0.0
2 0.0 NaN 0.0
3 1.0 NaN 1.0
4 1.0 NaN 0.0
Purpose Term Current Loan Amount \
0 debt consolidation Short Term 99999999.0
...
1 394972.0 18373.0 737.0 1
2 308389.0 13651.0 742.0 0
3 95855.0 11338.0 694.0 0
4 93309.0 7180.0 719.0 0
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
详细步骤解析:
查看前5行数据 ( data.head() )
- head() 方法默认显示前5行数据
- 输出包含表头和前5行数据
- 可以直观看到数据内容和格式
- 可以指定显示行数,如 data.head(10) 显示前10行
注:print("\n前5行数据:") 和 print(data.head()) 是一个完整的查看数据前5行的步骤。
- 第一部分提供说明,让输出更易读
- 第二部分是实际的数据查看操作
- 两者配合形成一个完整的数据查看步骤
如果简化成一行也是可以的:
print("\n前5行数据:\n", data.head())
3.查看空值
print("\n各列缺失值数量:")
print(data.isnull().sum())
详细的步骤解析:
1. 打印标题 ( print("\n各列缺失值数量:") )
- \n 是换行符,使输出结果与之前内容空一行,更清晰
- 输出中文提示"各列缺失值数量:",方便阅读结果
2. 计算缺失值数量 ( data.isnull().sum() )
- data.isnull() :生成一个布尔矩阵(DataFrame),True表示缺失值
- .sum() :对每列的True值(缺失值)进行求和统计
- 最终返回一个Series对象,包含每列的缺失值总数
输出的结果是:
各列缺失值数量:
Id 0
Home Ownership 0
Annual Income 1557
Years in current job 371
Tax Liens 0
Number of Open Accounts 0
Years of Credit History 0
Maximum Open Credit 0
Number of Credit Problems 0
Months since last delinquent 4081
Bankruptcies 14
Purpose 0
Term 0
Current Loan Amount 0
Current Credit Balance 0
Monthly Debt 0
Credit Score 1557
Credit Default 0
dtype: int64
注:实际应用场景:
1. 数据清洗前了解数据质量
2. 检查数据采集或导入是否出现问题
3. 确定哪些列需要特别处理
4.众数、中位数填补空值
from collections import Counter
# 定义填充函数
def fill_missing(df):
# 步骤1:遍历每一列
for column in df.columns:
# 步骤2:检查该列是否有缺失值
if df[column].isnull().sum() > 0:
# 步骤3:判断列数据类型
if df[column].dtype == 'object': # 分类数据
# 步骤4a:计算众数
mode = Counter(df[column].dropna()).most_common(1)[0][0]
# 步骤5a:用众数填充缺失值
df[column].fillna(mode, inplace=True)
else: # 数值型数据
# 步骤4b:计算中位数
median = df[column].median()
# 步骤5b:用中位数填充缺失值
df[column].fillna(median, inplace=True)
# 步骤6:返回处理后的DataFrame
return df
详细步骤解析:
1. 导入工具包 :
- from collections import Counter :导入Counter类用于计算众数
2. 遍历每一列 :
- for column in df.columns :循环处理DataFrame的每一列
3. 检查缺失值 :
- df[column].isnull().sum() > 0 :统计该列缺失值数量,大于0表示有缺失
4. 数据类型判断 :
- df[column].dtype == 'object' :判断是否是分类数据(文本类型)
5. 分类数据处理 :
- dropna() :先删除缺失值
- Counter().most_common(1)[0][0] :计算出现次数最多的值(众数)
- fillna(mode) :用众数填充缺失值
6. 数值型数据处理 :
- median() :计算中位数
- fillna(median) :用中位数填充缺失值
7. 返回结果 :
- return df :返回处理后的DataFrame
5.利用循环补全所有列的空值
data_filled = fill_missing(data.copy())
步骤1:复制原始数据 → 步骤2:填充缺失值 → 步骤3:存储结果
详细步骤解析:
1. 复制原始数据 ( data.copy() )
- 使用 copy() 方法创建数据的独立副本
- 避免直接修改原始数据,保持数据原始状态
- 这是数据处理的良好实践
2. 应用填充函数 ( fill_missing() )
- 自动处理所有列的缺失值
- 内部工作流程:
a. 遍历每一列(文本列和数值列都会处理)
b. 对每列检测是否存在缺失值
c. 根据数据类型选择填充策略:
- 文本数据 → 用众数(出现最频繁的值)填充
- 数值数据 → 用中位数填充
d. 执行填充操作
3. 存储结果 ( data_filled = )
- 将处理后的数据保存到新变量 data_filled 中
- 原始数据 data 保持不变
- 方便后续对比处理前后的数据差异
注:举例辅助理解
假设原始数据 data 包含:
年龄 城市
0 25.0 北京
1 NaN 上海
2 30.0 NaN
3 35.0 北京
4 NaN 广州
执行后 data_filled 将变为:
年龄 城市
0 25.0 北京
1 30.0 上海 # 年龄用中位数30填充
2 30.0 北京 # 城市用众数"北京"填充
3 35.0 北京
4 30.0 广州
6.验证补充结果
print("\n填充后各列缺失值数量:")
print(data_filled.isnull().sum())
详细步骤解析:
1. 打印验证标题 ( print("\n填充后各列缺失值数量:") )
- \n 是换行符,使输出与之前内容空一行,更清晰
- 输出中文提示"填充后各列缺失值数量:",说明接下来要显示的内容
2. 计算缺失值数量 ( data_filled.isnull().sum() )
- data_filled.isnull() :生成布尔矩阵,True表示对应位置是缺失值
- .sum() :对每列的True值进行求和,统计每列的缺失值数量
- 对处理后的数据 data_filled 进行检查(不是原始数据 data )
3. 输出结果 ( print() )
- 打印缺失值统计结果
- 理想情况下应该显示所有列的缺失值数量都为0
输出的结果为:(最终结果)
填充后各列缺失值数量:
Id 0
Home Ownership 0
Annual Income 0
Years in current job 0
Tax Liens 0
Number of Open Accounts 0
Years of Credit History 0
Maximum Open Credit 0
Number of Credit Problems 0
Months since last delinquent 0
Bankruptcies 0
Purpose 0
Term 0
Current Loan Amount 0
Current Credit Balance 0
Monthly Debt 0
Credit Score 0
Credit Default 0
dtype: int64
注:
为什么应该全为0 :
- 填充函数已经处理了所有列的缺失值
- 没有遗漏任何列或任何缺失值
- 填充操作是完整的、彻底的
如果出现非0的情况 :
- 可能某些特殊类型的缺失值未被识别
- 可能数据中存在非标准缺失值表示(如"NA"字符串)
- 可能填充函数存在逻辑缺陷
@浙大疏锦行