60天Python训练 day4

初试Pandas库与缺失数据的补全

本次代码均在.ipynb文件中编辑

数据的读取与查看

#导入pandas库
import pandas as pd

#读取文件
data = pd.read_csv(r“data.csv”)
#这里的data.csv是相对路径

【注】(1)pd.read_csv() :表示用pandas里的read_csv方法,专门用于读取 CSV格式的文件,并将其转换为 DataFrame 对象。 DataFrame 是 pandas 里用于存储二维表格数据的主要数据结构,类似于 Excel 表格。

(2)r'data.csv' :这里的 r 表示原始字符串,使用原始字符串可以避免反斜杠 \ 被当作转义字符处理。 任何时候都可以使用原始字符串r,它会保持字符串的原始值,而不进行任何转义。

(3)data = ... :将读取的 CSV 文件内容存储在变量 data 中,后续就可以使用 data 这个变量对数据进行各种操作。

(4)在 pd.read_csv() 函数里,参数需要是字符串类型,代表要读取的 CSV 文件的路径。所以data.csv外面需要加上引号,引号可以是单引号,也可以是双引号。

查看文件类型,已经赋值给data了,所以查看data的类型即可

type(data)
pandas.core.frame.DataFrame

【注】(1)type() 函数 :这是 Python 的内置函数,接收一个对象作为参数,然后返回该对象所属的类(类型)。在 Python 里,一切皆对象,每个对象都有对应的类型,像整数对象的类型是 int ,字符串对象的类型是 str ,如type('a')返回的就是str,上述变量data被赋值为了一个文件,所以type(data)返回该文件的类型

(2)若表格只有一列(一维列向量),则是Series类型;若是多列,则是DataFrame类型

检查缺失值

data.isnull()

【注】

(1)isnull() 是 pandas 库为 DataFrame 和 Series 对象提供的一个方法。data.isnull() 的作用是对 data 里的每个元素进行检查,判断其是否为缺失值。如果元素是缺失值,对应的位置就会返回 True ;如果不是缺失值,则返回 False 。最终返回一个和 data 形状相同的布尔型DataFrame(矩阵) 或者 Series(一维列向量) 。

(2)在 Python 里,“A.B” 这种结构被称为属性访问或者方法调用,具体取决于 “B” 是属性还是方法

属性访问:属性是对象所拥有的特征或者数据。例如, pandas 的 DataFrame 对象有 shape 属性,它能返回 DataFrame 的行数和列数。如在ipynb文件中data.shape能打印出data的行列数:(行数,列数),在py文件中

rows, columns = data.shape

print(f"行数: {rows}, 列数: {columns}")

能打印出    行数:xx,列数:xx

方法调用:方法是对象可以执行的操作。方法本质上是定义在类里的函数。就像前面提到的 isnull() 就是 DataFrame 对象的一个方法,用于检查缺失值。调用方法时需要在方法名后面加上括号 () ,如果方法有参数,参数要放在括号里。

看看data.isnull()返回的是什么

type(data.isnull())
pandas.core.frame.DataFrame

依然是DataFrame

查看数据的基本结构、形式和内容

data.head(10)

【注】data.head(10) 是 pandas 库中 DataFrame 或 Series 对象的head方法调用。 head() 方法的主要作用是返回对象的前几行数据,默认返回前 5 行,当传入参数 10 时,就会返回前 10 行数据。

读取excel文件

data2 =pd.read_excel('data.xlsx')
data2

【注】(1)#pandas读取excel需要安装openpyxl库

(2)read_excel与read_csv类似,这里用来读取.xlsx或.xls文件

(3)关于第二行的data2:在 Jupyter Notebook( .ipynb 文件)里,当一个变量单独作为单元格的最后一行代码时Jupyter 会自动输出该变量的值。所以这行代码的作用是展示 data2 这个 DataFrame 的内容,方便用户查看读取到的 Excel 数据。(py文件里则需要print(data2))

查看内容(同理)

data2.head(10)

数据信息的查看

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

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

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

data.info()
# 查看data中的column(列名)、Non-Null Count(非空值),Dtype(数据类型)

 返回DataFrame

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

返回的是元组zuple 

data.columns
# 查看所有的列名

columns 是 DataFrame 对象的一个属性,它返回一个 Index 对象,该对象包含了 DataFrame 所有列的列名。

data.describe()
# 查看每一列的基本统计量:mean、std、min、25%、50%、75%、max

 返回类型为DataFrame

data.dtypes   
# 查看每一列的类型:int64,float64,object

【注】dtype 是 pandas 的 Series 对象的一个属性,用于返回该 Series 中元素的数据类型。这里返回整个data这个DataFrame中每列的数据类型

data["Annual Income"].dtype
# 查看具体的"Annual Income"这列的dtype信息

【注】这部分是通过索引操作从 data 这个 DataFrame 中选取名为 "Annual Income" 的列。在 pandas 里,可以使用方括号 [] 并传入列名来获取特定的列,返回的是一个 pandas 的 Series 对象, Series 是一维的带标签数组。加上.dtype后最终整个返回的是该series中元素的数据类型

data.isnull()  
#查看缺失值

计算缺失值数量

data.isnull().sum()

【注】(1)data变量前面已赋值为一个DataFrame,data.isnull()查看缺失值,返回的是一个DataFrame,再后面的sum()可视为对data.isnull()这个整体DataFrame使用sum()方法

(2)sum()方法:在布尔值的 DataFrame 或 Series 上调用 sum() 方法时, pandas 会将 True 视为 1, False 视为 0,然后对每列(对于 DataFrame )或整个序列(对于 Series )进行求和。也就是说这里最后得到的是每一列的缺失值数量(每一列True的数量之和)

类似地

data["Annual Income"].isnull.sum()

先对data里的Annual Income列查看缺失值,data["Annual Income"].isnull返回Series,再对这个Series中的缺失值数量求和

缺失值的填补

上述发现数值型中Annual Income、Months since last delinquent、Bankruptcies、Credit Score有缺失值(虽然Years in current job也有缺失值,但它不是数值型)

(1)用中位数

#计算'Annual Income'列的中位数并赋值给median_income
#这样后面就可以用简短的median_income代替长的data['Annual Income'].median()使用
median_income = data['Annual Income'].median()

#打印出median_income查看具体是多少
median_income

DataFrame 可选取某一列后调用 median() 方法计算该列的中位数。

data['Annual Income'].fillna(median_income)

fillna() :这是 Pandas 的 Series 和 DataFrame 对象都具备的方法,其作用是填充缺失值。 fillna() 方法接收一个参数,该参数的值会被用来填充数据中的缺失值。

data['Annual Income'].isnull().sum()

再次检查该列是否有缺失值,现在现在没有了 

(2)使用众数(类似)

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

 由于这里返回了四个频率最高的值,一般我们选第一个

# 把上面那个属于是Series的mode的第一个数即mode[0](索引方法)赋值给新的变量mode
# 这样新的mode就是一个数值型(这里为float64)了
mode = mode[0]
# 众数填补
data['Annual Income'].fillna(mode)
# 检查下是否有缺失值
data['Annual Income'].isnull().sum()

填补所有的数值型缺失值

总思路:

①先把data.column这个包含所有列名的Index转化成list列表

②再用for循环填补每一个有缺失值的列

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

【注】(1)columns 是 DataFrame 对象的一个属性,它返回一个 Index 对象,该对象包含了 DataFrame 所有列的列名。

(2).tolist() :这是 Index 对象的一个方法,其作用是将 Index 对象转换为 Python 的列表。

(3)type(c)查看变量 c 的数据类型,输出 list ,表明 c 是一个列表。

# 循环遍历c这个列表中的每一列
for i in c:
    
    # 找到为数值型的列
    if data[i].dtype != 'object': # 如果第i列是数值型
        #这里i不用加引号,因为i是变量名,代表c中的每一列名,其每一个列名已经加了引号,是字符串
      
        if data[i].isnull().sum() > 0:  # 如果这时第i列的缺失值数量不为0
            #计算该列的均值
            mean_value = data[i].mean()
            #用均值填充缺失值
            data[i].fillna(mean_value, inplace=True)

data.isnull().sum()

# 注意每一行的缩进!

【注】把 data.columns 这个 Index 对象转化成列表 list 后再进行 for 循环并非强制要求, Index 对象本身就是可迭代的,能直接用于 for 循环。

@浙大疏锦行

你可能感兴趣的:(python,开发语言)