Python打卡训练营-Day4-缺失值的处理

@浙大疏锦行

题目:初识pandas库与缺失数据的补全

按照示例代码的要求,去尝试补全信贷数据集中的数值型缺失值

  1. 打开数据(csv文件、excel文件)
  2. 查看数据(尺寸信息、查看列名等方法)
  3. 查看空值
  4. 众数、中位数填补空值
  5. 利用循环补全所有列的空值

完成后在py文件中独立完成一遍,并且利用debugger工具来查看属性(不借助函数显式查看)----养成利用debugger工具的习惯

# 读取数据
import pandas as pd
data = pd.read_csv(r'day04_data.csv')
type(data) # 类

pandas.core.frame.DataFrame

方法 :人.跳舞() 

属性: 人.年龄

data.isnull() # 布尔矩阵显示缺失值,这个方法返回一个布尔矩阵,也是dataframe对象,其中True表示对应位置的值是缺失值,False表示对应位置的值不是缺失值。

data.head(10)

# pip install openpyxl
# pandas读取excel需要安装openpyxl库,去anaconda prompt中安装
data2 =pd.read_excel('day04_data.xlsx')
data2

data.head(10)

数据信息的查看

此时data是一个dataframe类型的对象,可以理解为dataframe类的实例。实例就具有类的属性和方法。

属性的调用格式为:实例名.属性名。

方法的调用格式为:实例名.方法名()。

data.info()       # 列名、非空值、数据类型

data.shape        # (行数, 列数) data的属性

 (7500, 18)

data.columns      # 所有列名 data的属性

 Index(['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'],
      dtype='object')

data.describe()   # 数值列的基本统计量

# dtype 是 data type 的缩写,用于描述数据类型。后续会频繁借助这个方法来查看某一列数据的属性
data.dtypes       # 各列数据类型
data.info()

 <class 'pandas.core.frame.DataFrame'>
RangeIndex: 7500 entries, 0 to 7499
Data columns (total 18 columns):
 #   Column                        Non-Null Count  Dtype  
---  ------                        --------------  -----  
 0   Id                            7500 non-null   int64  
 1   Home Ownership                7500 non-null   object 
 2   Annual Income                 5943 non-null   float64
 3   Years in current job          7129 non-null   object 
 4   Tax Liens                     7500 non-null   float64
 5   Number of Open Accounts       7500 non-null   float64
 6   Years of Credit History       7500 non-null   float64
 7   Maximum Open Credit           7500 non-null   float64
 8   Number of Credit Problems     7500 non-null   float64
 9   Months since last delinquent  3419 non-null   float64
 10  Bankruptcies                  7486 non-null   float64
 11  Purpose                       7500 non-null   object 
 12  Term                          7500 non-null   object 
 13  Current Loan Amount           7500 non-null   float64
 14  Current Credit Balance        7500 non-null   float64
 15  Monthly Debt                  7500 non-null   float64
 16  Credit Score                  5943 non-null   float64
 17  Credit Default                7500 non-null   int64  
dtypes: float64(12), int64(2), object(4)
memory usage: 1.0+ MB

data["Annual Income"].dtype # 查看某一列的数据类型

dtype('float64') 

data.isnull() # 布尔矩阵显示缺失值,这个方法返回一个布尔矩阵,也是dataframe对象,其中True表示对应位置的值是缺失值,False表示对应位置的值不是缺失值。

type(data.isnull()) # 布尔矩阵显示缺失值,这个方法返回一个布尔矩阵,其中True表示对应位置的值是缺失值,False表示对应位置的值不是缺失值。

pandas.core.frame.DataFrame

data.isnull().sum()      # 每列缺失值计数,sum方法为求每一列的和

 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

缺失值的填补

尝试用众数 中位数进行填补

data['Annual Income']

0        482087.0
1       1025487.0
2        751412.0
3        805068.0
4        776264.0
          ...    
7495     402192.0
7496    1533984.0
7497    1878910.0
7498          NaN
7499          NaN
Name: Annual Income, Length: 7500, dtype: float64

type(data['Annual Income'])
# dataframe里单独的一列是series

 pandas.core.series.Series

# 计算 'Annual Income' 列的中位数(会自动忽略 NaN 值)
median_income = data['Annual Income'].median()
median_income

1168386.0 

# 使用计算出的中位数填补该列的 NaN 值
# inplace=True 参数表示直接在原 DataFrame 上进行修改
# 如果不设置该参数,fillna() 方法会返回一个新的 DataFrame,原 DataFrame 不会被修改
data['Annual Income'].fillna(median_income, inplace=True)
# 检查下是否有缺失值
data['Annual Income'].isnull().sum()

 0

# 使用众数填充缺失值
import pandas as pd
data = pd.read_csv('day04_data.csv') #需要重新读取一遍数据
mode = data['Annual Income'].mode()
# mode() 会返回数据中出现频率最高的所有值,如果频次相同,会返回最多每个值。
mode

0     969475.0
1    1043651.0
2    1058376.0
3    1161660.0
4    1338113.0
Name: Annual Income, dtype: float64

# 这里返回了4个最多频次的值,我们一般保留第一个
mode = mode[0]
# 众数填补
data['Annual Income'].fillna(mode, inplace=True)
# 检查下是否有缺失值
data['Annual Income'].isnull().sum()

填补所有的数值型缺失值

从上面的打印信息可以看到,缺失值的数值列包括:Annual Income、Months since last delinquent、Bankruptcies、Credit Score。这些列的缺失值数量分别为1557、4081、14和1557。

data.columns

 Index(['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'],
      dtype='object')

type(data.columns)

pandas.core.indexes.base.Index 

很自然的 我们想要遍历打印这个对象中的每一个元素,如果是数值,就补全缺失值 

# 介绍一下tolist方法,将numpy数组和pandas对象转换成list
import numpy as np
a =np.array([1,2,3])
a.tolist()

[1, 2, 3]

c = data.columns.tolist()
type(c)

list 

# 循环遍历c这个列表中的每一列
for i in c:
    # 找到为数值型的列
    if data[i].dtype != 'object': # 找到为数值型的列
        if data[i].isnull().sum() > 0: # 找到存在缺失值的列
            #计算该列的均值
            mean_value = data[i].mean()
            #用均值填充缺失值
            data[i].fillna(mean_value, inplace=True)

data.isnull().sum()

 Id                                0
Home Ownership                    0
Annual Income                     0
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      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

代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值