本次代码均在.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外面需要加上引号,引号可以是单引号,也可以是双引号。
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 对象的一个方法,用于检查缺失值。调用方法时需要在方法名后面加上括号 () ,如果方法有参数,参数要放在括号里。
type(data.isnull())
pandas.core.frame.DataFrame
依然是DataFrame
data.head(10)
【注】data.head(10) 是 pandas 库中 DataFrame 或 Series 对象的head方法调用。 head() 方法的主要作用是返回对象的前几行数据,默认返回前 5 行,当传入参数 10 时,就会返回前 10 行数据。
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 循环。
@浙大疏锦行