dataframe 查找特定值_011-01-读书笔记:数据清洗:缺失值、异常值和重复值的处理...

2ed828293e6911a7b752b81839fc9f24.png

来源:《Python 数据分析与数据化运营》第3章:11条数据化运营不得不知道的数据预处理经验

数据列缺失的4种处理方法:

  1. 丢弃
  2. 补全
  3. 真值转换法
  4. 不处理:常见的能够自动处理缺失值的模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带有噪声的空间聚类)等。

在数据建模前的数据规约阶段,有一种归约的思路是降维,降维中又有一种直接选择特征的方法。假如能通过一定方法确定带有缺失值的字段对于模型的影响非常小,那么根本不需要对缺失值进行处理。因此,后期建模时对字段或特征的重要性判断也是决定是否处理字段缺失值的重要参考因素之一。

对于缺失值的处理思路是先通过一定方法找到缺失值,接着分析缺失值在整体样本中的分布占比以及缺失值是否具有显著的无规律分布特征,然后考虑后续要使用的模型中是否能满足缺失值的自动处理,最后决定采用哪种缺失值处理方法。

代码示例:

1.缺失值处理

#对于缺失值的处理主要配合使用sklearn.preprocessing中的Imputer类和、Pandas和Numpy
import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer 

#生成缺失数据
df = pd.DataFrame(np.random.randn(6, 4), columns=['col1', 'col2', 'col3', 'col4'])
df.iloc[1:2, 1] = np.nan #(2,2) 第2行,第2列
df.iloc[4, 3] = np.nan
print(df)

1efa634b5954324fa829327b0e227f9b.png
#查看缺失值
nan_all = df.isnull() #给出了原DataFrame是否为na的na值版
print(nan_all)
#查看哪些列缺失
nan_col1 = df.isnull().any() #查看含有na的列
nan_col2 = df.isnull().all() #查看全部为na的列
print(nan_col1)
print(nan_col2)

0fcf53acecf11157553dfc68c925792c.png
#丢弃缺失值
df2 = df.dropna() #直接丢弃含有na的行记录
print(df2)

dabd2b480e925bb37f12840bfa88f6b3.png
#使用sklearn将缺失值替换为特定值
nan_model = Imputer(missing_values='NaN', strategy='mean', axis=0) #用每列的均值替换其中的NaN
nan_result = nan_model.fit_transform(df) #应用模型规则
print(nan_result)

7787ba20c1190b15e53610c9d482387b.png
#使用Pandas将缺失值替换为待定值
nan_result_pd1 = df.fillna(method='backfill') #用后面的值替换缺失值
nan_result_pd2 = df.fillna(method='bfill', limit=1) #用后面的值替换缺失值,限制每列只能替换一个缺失值
nan_result_pd3 = df.fillna(method='pad') #用前面的值替换缺失值
nan_result_pd4 = df.fillna(0)  #用0替换缺失值
nan_result_pd5 = df.fillna({'col2':1.1, 'col4':1.2}) #用不同的值替换不同的列的缺失值
nan_result_pd6 = df.fillna(df.mean()['col2':'col4']) #用各自列的均值代替缺失值

2. 异常值处理

有关异常值的确定有很多规则和方法,这里使用Z标准化得到的阈值作为判断标准:当标准化后的得分超过阈值则为异常。

import pandas
df = pd.DataFrame({'col1':[1, 120, 3, 5, 2, 12, 13],
                  'col2':[12, 17, 31, 53, 22, 32, 43]})
print(df)

f2aa94b3e7c026c2840a64549a83585a.png
#通过Z-Score方法判断异常值
df_zscore = df.copy()
cols = df.columns
for col in cols:
    df_col = df[col]
    z_score = (df_col - df_col.mean()) / df_col.std() #计算每列的Z-score得分
    df_zscore[col] = z_score.abs() > 2.2  #判断Z-score得分是否大于2.2,如果是则为True,否则为False
print(df_zscore)

1a7ddf4e3655d1714f71c13c7f1b6c28.png

阈值的设定是确定异常与否的关键,通常当阈值大于2时,已经是相对异常的表现值。

主要需要考虑的关键点是:如何判断异常值。对于有固定业务规则可直接套用业务规则,对于没有固定业务规则,可以采用常见的数学模型进行判断,即基于概率分布模型(例如正态分布的标准差范围)、基于聚类的方法(KMeans)、基于密度的方法(LOF)、基于分类的方法(KNN)、基于统计的方法(分位数法)等,此时异常值带有较强的主观判断色彩,具体需要根据实际情况选择。

3. 重复值处理

import pandas as pd
data1 = ['a', 3]
data2 = ['b', 2]
data3 = ['a', 3]
data4 = ['c', 2]
df = pd.DataFrame([data1, data2, data3, data4], columns=['col1', 'col2'])
print(df)

0c7826b89c6ca9b2d1a3562357d66bda.png
#判断重复数据
isDuplicated = df.duplicated()
print(isDuplicated)

5f5015bc95b9c852bd804532544ac3da.png
#删除重复记录
new_df1 = df.drop_duplicates() #删除记录中所有列值相同的记录
new_df2 = df.drop_duplicates(['col2']) #删除记录中所有col2值相同的记录
new_df3 = df.drop_duplicates(['col1', 'col2']) #删除记录中指定列值相同的记录
print('new_df{}:n{}n'.format(1, new_df1))
print('new_df{}:n{}n'.format(2, new_df2))
print('new_df{}:n{}n'.format(3, new_df3))

d6602466b6c999a8254b1f8ba44bbc72.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值