机器学习随笔(1)——pandas.DataFrame和数据清洗
目录
1. pandas.DataFrame
2. 数据清洗
当我试图深入掌握机器学习基础时,意识到这些基础知识还未完全稳固,并且许多用法难以掌握。为了巩固所学内容并便于后续复习,特此笔记来回顾一下。
1. pandas.DataFrame
以下是官方参考链接:
pandas.DataFrame — pandas 1.4.4 documentation (pydata.org)
菜鸟编程中的讲解:
Pandas 中的数据结构——DataFrame | 菜鸟教程
首先,我们看一下DataFrame的构造方法。
pandas.DataFrame( data, index, columns, dtype, copy)
'''
参数说明:
5. data:一组数据(ndarray、series, map, lists, dict 等类型)。
7. index:索引值,或者可以称为行标签。
9. columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
11. dtype:数据类型。
13. copy:拷贝数据,默认为 False。
'''
通常我们最多用到data, index, columns。
代码展示如下:
import pandas as pd
data = [['Tom',18],['Bob',20],['Jim',30]]
df = pd.DataFrame(data,columns = ['Name','Age'],index = ['a','b','c'])
df
运行结果如下:

一般不建议采用这种方法。因为我们使用字典形式的数据就能实现目标,并且无需特别关注列标签与索引除非我们有特殊需求
import pandas as pd
data = {'Name':['Tom','Bob','Jim'],'Age':[18,20,30]}
df = pd.DataFrame(data)
df
运行结果如下:

注意,下面这种写法和上面是一样的。
import pandas as pd
data = [{'Name':'Tom','Age':18},{'Name':'Bob','Age':20},{'Name':'Jim','Age':30}]
df = pd.DataFrame(data)
df
运行结果如下:

2. 数据清洗
数据清理是执行无用数据处理的流程。
大量存在格式错误、错误值或重复值等问题的数据集,
为了提高数据分析的准确性,
必须解决这些问题中的无用数据问题。
数据清理是执行无用数据处理的流程。
大量存在格式错误、错误值或重复值等问题的数据集,
为了提高数据分析的准确性,
必须解决这些问题中的无用数据问题。
参考链接:
Pandas 数据清洗 | 菜鸟教程 (runoob.com)
大家可以去该链接下载所需数据文件。
首先载入数据:
import pandas as pd
df = pd.read_csv('E:/PYTHON/property-data.csv')
df.head(10)
运行结果如下:

我们可以通过 isnull() 判断各个单元格是否为空。
print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())
运行结果如下:
0 3
1 3
2 NaN
3 1
4 3
5 NaN
6 2
7 1
8 na
Name: NUM_BEDROOMS, dtype: object
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 False
8 False
Name: NUM_BEDROOMS, dtype: bool
如前所述,在某些情况下,**isnull()**并未将na视为空数据。然而我们可以通过自定义的方式设定空数据类型以满足特定需求。
missing_values = [ "na",]
df = pd.read_csv('E:/PYTHON/property-data.csv', na_values = missing_values)
print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())
运行结果如下:
0 3.0
1 3.0
2 NaN
3 1.0
4 3.0
5 NaN
6 2.0
7 1.0
8 NaN
Name: NUM_BEDROOMS, dtype: float64
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 False
8 True
Name: NUM_BEDROOMS, dtype: bool
如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
'''
参数说明:
5. axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how='all' 一行(或列)都是 NA 才去掉这整行。
thresh:设置需要多少非空值的数据才可以保留下来的。
subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。
'''
下面我们演示一下删除包含空数据行后的结果:
df.dropna(inplace = True)
df
运行结果如下:

然而,在我们的数据集样本数量极少的情况下,通常会采取针对缺失值的处理方法或填补空白数据的技术。
df = pd.read_csv('E:/PYTHON/property-data.csv')
df.fillna(666, inplace = True)#替换所有空数据
print(df)
print('###############################################################################')
df = pd.read_csv('E:/PYTHON/property-data.csv')
df['PID'].fillna(666, inplace = True)#替换指定列空数据
print(df)
print('###############################################################################')
df = pd.read_csv('E:/PYTHON/property-data.csv')
x = df["ST_NUM"].mean()
df["ST_NUM"].fillna(x, inplace = True)#使用均值替换指定列空数据
print(df)
print('###############################################################################')
df = pd.read_csv('E:/PYTHON/property-data.csv')
x = df["ST_NUM"].median()
df["ST_NUM"].fillna(x, inplace = True)#使用中位数替换指定列空数据
print(df)
print('###############################################################################')
df = pd.read_csv('E:/PYTHON/property-data.csv')
x = df["ST_NUM"].mode()
df["ST_NUM"].fillna(x, inplace = True)#使用众数替换指定列空数据
print(df)
