使用pandas进行数据清洗
- 在获取原始数据的过程中会出现一些异常数据(即会对分析产生负面影响的数据),这些异常数据需要得到妥善处理。
- 处理缺失信息的问题
- 去除重复记录的问题
- 剔除异常观测值的问题
导入pandas库,并使用pd作为别名。
从pandas库导入DataFrame和Series对象。
导入numpy库,并使用np作为别名。
pandas处理空值操作
- isnull
- notnull
- any
- all
- dropna
- fillna
构建数据框用于存储随机整数数组,并使用均匀分布生成7行5列的数据。
随后将第1行第4列设置为NaN值,
并在第4行第4列插入None类型变量,
同时将第3行第3列以及第五行第四列的元素置为空值。
最后输出完整的数据框架结构。
该操作展示了如何在数据框中处理缺失值。

缺失值的处理方案:
* 1.可以将空值对应的行/列进行删除
* 2.可以将空值进行填充
将空值对应的行进行删除
ret = df.isnull() #可以通过isnull判断df中是否存在空数据
ret

监测 ret 表中的哪些行为缺失(表明 df 中有多少行为缺失)
ex = ret.any(axis=0) # 轴向为列
any 函数用于判断每列是否有非零值
ex

#整合后的结果;在df中True对应的行是存在空值
ex = df.isnull().any(axis=1)
ex

ex = ~df.isnull().all(axis=1) #该函数使用axis=1参数,在每一行上检查所有值是否都存在(即不为NaN或缺失值)。如果某一行的所有值都存在,则返回True;否则返回False

df.loc[ex] #通常可以用notall到all返回的结果来表示df的索引位置,并排除对应为空的数据

更简便的处理缺失值对应行的方式
特别注意:dataframe.dropna函数中,默认axis参数设置为0(即处理行),该函数用于删除数据框中所有缺失值对应的行数据。

了解df各列存在缺失值的数量及其占比情况。
遍历df中的每一列。
col为当前遍历的数据框的一列索引号。
如果该列存在缺失值,则进行后续操作。
计算该缺失值的比例。
将比例四舍五入至两位小数以获得百分比显示。
打印当前处理过的列为col,并输出其缺失比例为: p。

- 将空值进行填充
#使用任意值对空值进行填充
df.fillna(value=666) #将df中所有的空值填充为666

#基于相关数据填补缺失值(相邻的数值)
df.fillna(method='bfill', axis=0) #沿着垂直方向采用后一个有效数值替代缺失值
#其中参数method指定填补方式:ffill表示从前一个有效数值向前填补缺失值;而bfill则从后一个有效数值向后填补。

#利用具有意义的数据填补数据缺失(统计数值)
#通过计算各列平均值得出填补数值
for each column in df.columns:
if there are missing values in column col:
calculate the mean value for column col
replace the missing values of column col with its mean
df

注意:在处理缺失数据时,默认应优先采用删除策略;当处理成本较高时,则可考虑采用填补的方法。
处理重复数据
- 基于duplicated和drop进行删除重复行操作
df = DataFrame(data=np.random.randint(0,100,size=(8,5)))
df.iloc[3] = [0,0,0,0,0]
df.iloc[5] = [0,0,0,0,0]
df.iloc[7] = [0,0,0,0,0]
df

#如何确定数据中是否存在重复的行记录
函数df.duplicated() #该方法可以帮助确定原始数据中的哪些行记录是存在重复的. 当某一行记录被标记为True时, 表示该记录与另一条相同的记录存在重合; 若返回结果为False, 则表示该条记录是唯一的

该函数用于计算dataframe中的重复记录数量,并显示结果为2。
共有两处重复记录。
通过调用drop_duplicates方法可以去除dataframe中的所有重复记录。
df

处理异常/离群数据
异常值是分析师和数据科学家常用的重要术语;由于需要用它来确保准确性,在数据分析中发现并识别这些点非常重要;换句话说……明显偏离常规的数据模式。
在统计学领域中所指的“疑似异常值”通常被称为“离群点”(outlier)。研究这些离群点及其特征的过程则统称为离群点分析。“极端数值”指的是那些在数据集中表现为极端数值的一类观测结果通常被定义为“极端数值”。某些观察结果可能显示出显著高于或低于其他观察结果的趋势,“整体分布模式”与其余观测相比存在显著差异。“用于识别并排除不符合预期的数据这一过程对于确保数据分析质量至关重要”。忽略这些特殊现象可能导致研究结论产生偏差,“仅仅删除”这些不寻常数据并不足以解决问题。“深入探究”这些特殊现象的原因不仅有助于发现潜在的问题还可能提供改进决策的新思路。
举例来说,在进行客户分析时发现某一群人的年平均收入为80万美元。然而,在这组数据中存在两位客户的特殊情况:他们的年收入分别为4美元和420万美元。这些情况与其他人明显不同,并且这些特殊的观察结果将被识别为异常值。
基于给定条件的异常数据清洗流程中,
生成一个包含1000行、3列(分别为A、B、C)的数据源,
其中各列取值范围限定在[0,1]区间内;
随后对C列数据进行统计分析,
去除超出该列均值上下两倍标准差范围的数据
import pandas as pd
from pandas import DataFrame
import numpy as np
data = DataFrame(data=np.random.random(size=(1000,3)),columns=[‘A’,‘B’,‘C’])
data

通过计算C列数据的标准差并乘以二得到了twice_std变量
twice_std = 2 * data[‘C’].std()
随后通过比较该列值与twice_std获得布尔索引ex
ex = data[‘C’] > twice_std
最后利用此索引筛选出超出范围的数据行
data.loc[ex] #提取异常值

indexs = data.loc[ex].index #取出了异常值对应行数据的行索引
indexs

该代码执行会从'data'对象中删除指定索引处的记录。此注释旨在说明,在处理'data'时会去除与异常值相关的记录。该变量通常用于存储原始或预处理后的数据集。

该方法 亦称拉依达准则(标准差法),用于剔除一些异常数据 以提高数据精度。
主要适用于服从或近似服从正态分布的数据样本处理 尤其是当样本数量较大时更为适用。
- 工作原理:
- 假设一组检测数据中存在异常数值,并对其进行计算处理得到标准偏差σ后设定一个区间范围。随后将超出该区间的数值认定为异常并予以剔除。
- 标准差能够反映因子值分布的分散程度其计算依据是该因子的均值μ。在识别离群值的过程中可用μ ± nσ来评估因子与均值之间的距离(其中n通常取用3)。
- 将落在[μ - 3σ, μ + 3σ]范围内的数值定义为正常观测值在此之外则被视为离群数值。

#生成一组包含五个异常数据的样本
import numpy as np
#利用numpy生成服从标准正态分布的数据
iris_length = abs(np.random.randn(9999))
#手动添加了一些异常数据
for i in [11,22,33,44,55]:
#将指定位置的数据设置为特定值
iris_length[i] = [87,67,78,56,49][i-1]

statistical_outlier_detector(data):
calculate_mean_val = data.mean()
calculate_std_val = data.std()
lower_bound: float = calculate_mean_val - 3 * calculate_std_val
upper_bound: float = calculate_mean_val + 3 * calculate_std_val
return lower_bound, upper_bound
m_min,m_max = std_opt(iris_length)
for i in iris_length:
if i < m_min or i > m_max:
print(i)
87.0
56.0
67.0
54.0
49.0
- MAD法
也可称为绝对差中位数值法的一种方法是首先需要计算每个因子与其中位数之间的距离总和以检测离群值,并且适用于处理大量数据的情况。
公式:设有平稳离散数据X=[x1,x2,…,xn],其数据中位数为X_median:

应用场景:
- 在数据呈现对称分布时,MAD方法与标准差方法表现相同。
- 当数据呈现偏态分布特征时,建议采用众数或中位数作为数据代表值,其代表性显著优于算术平均值。
def calculate_median_outliers(data):
median = np.median(data)
n = len(data)
a = np.sqrt(((data - median) ** 2).sum() / n)
m_min, m_max = (median - 3 * a, median + 3 * a)
return m_min, m_max
median_opt函数作用于 iris_length数据集
得到结果为 (-3.94798971, 5.30266326)
将结果赋值给变量 min 和 max
遍历所有数据点
如果某个数据点低于 min 或高于 max 则输出该数值
输出结果分别为:
87.0;
56.0;
67.0;
54.0;
49.0。
