注:代码用 jupyter notebook跑的,分割线线上为代码,分割线下为运行结果
1.导入库生成缺失值
(资料图片仅供参考)
通过pandas生成一个6行4列的矩阵,列名分别为"col1","col2","col3","col4",同时增加两个缺失值数据。
import numpy as np import pandas as pd from sklearn.impute import SimpleImputer #生成缺失数据 df=pd.DataFrame(np.random.randn(6,4),columns=["col1","col2","col3","col4"]) #生成一份数据 #增加缺失值 df.iloc[1:2,1]=np.nan df.iloc[4,3]=np.nan df
col1 col2 col3 col4
0 -0.480144 1.463995 0.454819 -1.531419
1 -0.418552 NaN -0.931259 -0.534846
2 -0.028083 -0.420394 0.925346 0.975792
3 -0.144064 -0.811569 -0.013452 0.110480
4 -0.966490 -0.822555 0.228038 NaN
5 -0.017370 -0.538245 -2.083904 0.230733
2.查看哪些值缺失(第2行第2列,第5行第4列)
nan_all=df.isnull() #获得所有数据中的nan nan_all
col1 col2 col3 col4
0 False False False False
1 False True False False
2 False False False False
3 False False False False
4 False False False True
5 False False False False
3 any()方法来查找含有至少1个缺失值的列,all()方法来查找全部缺失值的列
#使用any方法 nan_col1=df.isnull().any() #获得含有nan的列 print(nan_col1)
col1 False
col2 True
col3 False
col4 True
dtype: bool
#使用all方法 nan_col2=df.isnull().all() #获得全部为nan的列 print(nan_col2)
col1 False
col2 False
col3 False
col4 False
dtype: bool
4.法一:直接丢弃缺失值
df1=df.dropna()#直接丢弃含有nan的行记录 df1
col1 col2 col3 col4
0 -0.480144 1.463995 0.454819 -1.531419
2 -0.028083 -0.420394 0.925346 0.975792
3 -0.144064 -0.811569 -0.013452 0.110480
5 -0.017370 -0.538245 -2.083904 0.230733
5.法二:使用sklearn将缺失值替换为特定值
首先通过SimpleImputer创建一个预处理对象,缺失值替换方法默认用均值替换,及strategy=mean,还可以使用中位数median,众数most_frequent进行替换,接着使用预处理对象的fit_transform对df进行处理,代码如下:
#使用sklearn将缺失值替换为特定值 nan_mean=SimpleImputer(strategy="mean") #用均值填补 nan_median=SimpleImputer(strategy="median") #用中位数填补 nan_0=SimpleImputer(strategy="constant",fill_value=0) #用0填补 #应用模型 nan_mean_result=nan_mean.fit_transform(df) nan_median_result=nan_median.fit_transform(df) nan_0_result=nan_0.fit_transform(df) print(nan_mean_result) print(nan_median_result) print(nan_0_result)
[-0.48014389 1.46399462 0.45481856 -1.53141863]
[-0.4185523 -0.22575384 -0.93125874 -0.53484561]
[-0.02808329 -0.42039426 0.925346 0.97579191]
[-0.14406438 -0.81156913 -0.0134516 0.11048025]
[-0.96649028 -0.82255505 0.22803842 -0.14985173]
[-0.01737047 -0.53824538 -2.0839036 0.23073341]
[-0.48014389 1.46399462 0.45481856 -1.53141863]
[-0.4185523 -0.53824538 -0.93125874 -0.53484561]
[-0.02808329 -0.42039426 0.925346 0.97579191]
[-0.14406438 -0.81156913 -0.0134516 0.11048025]
[-0.96649028 -0.82255505 0.22803842 0.11048025]
[-0.01737047 -0.53824538 -2.0839036 0.23073341]
[-0.48014389 1.46399462 0.45481856 -1.53141863]
[-0.4185523 0. -0.93125874 -0.53484561]
[-0.02808329 -0.42039426 0.925346 0.97579191]
[-0.14406438 -0.81156913 -0.0134516 0.11048025]
[-0.96649028 -0.82255505 0.22803842 0. ]
[-0.01737047 -0.53824538 -2.0839036 0.23073341]
6.法三:使用pandas将缺失值替换为特定值
pandas对缺失值处理方法是df.fillna(),该方法的两个主要参数是value和method。前者通过固定或手动指定的值替换缺失值,后者使用pandas提供的方法替换缺失值。以下是method支持的方法:
(1)pad和ffill:使用前面的值替换缺失值
(2)backfill和bfill:使用后面的值替换缺失值
(3)大多数情况下用均值、众数、中位数的方法较为常用
#使用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) nan_result_pd5=df.fillna({"col2":1.1,"col4":1.2}) #手动指定两个缺失值分别为1.1,1.2 nan_result_pd6=df.fillna(df.mean()["col2":"col4"]) nan_result_pd7=df.fillna(df.median()["col2":"col4"]) print(nan_result_pd1) print(nan_result_pd2) print(nan_result_pd3) print(nan_result_pd4) print(nan_result_pd5) print(nan_result_pd6) print(nan_result_pd7)
col1 col2 col3 col4
0 -0.480144 1.463995 0.454819 -1.531419
1 -0.418552 -0.420394 -0.931259 -0.534846
2 -0.028083 -0.420394 0.925346 0.975792
3 -0.144064 -0.811569 -0.013452 0.110480
4 -0.966490 -0.822555 0.228038 0.230733
5 -0.017370 -0.538245 -2.083904 0.230733
col1 col2 col3 col4
0 -0.480144 1.463995 0.454819 -1.531419
1 -0.418552 -0.420394 -0.931259 -0.534846
2 -0.028083 -0.420394 0.925346 0.975792
3 -0.144064 -0.811569 -0.013452 0.110480
4 -0.966490 -0.822555 0.228038 0.230733
5 -0.017370 -0.538245 -2.083904 0.230733
col1 col2 col3 col4
0 -0.480144 1.463995 0.454819 -1.531419
1 -0.418552 1.463995 -0.931259 -0.534846
2 -0.028083 -0.420394 0.925346 0.975792
3 -0.144064 -0.811569 -0.013452 0.110480
4 -0.966490 -0.822555 0.228038 0.110480
5 -0.017370 -0.538245 -2.083904 0.230733
col1 col2 col3 col4
0 -0.480144 1.463995 0.454819 -1.531419
1 -0.418552 0.000000 -0.931259 -0.534846
2 -0.028083 -0.420394 0.925346 0.975792
3 -0.144064 -0.811569 -0.013452 0.110480
4 -0.966490 -0.822555 0.228038 0.000000
5 -0.017370 -0.538245 -2.083904 0.230733
col1 col2 col3 col4
0 -0.480144 1.463995 0.454819 -1.531419
1 -0.418552 1.100000 -0.931259 -0.534846
2 -0.028083 -0.420394 0.925346 0.975792
3 -0.144064 -0.811569 -0.013452 0.110480
4 -0.966490 -0.822555 0.228038 1.200000
5 -0.017370 -0.538245 -2.083904 0.230733
col1 col2 col3 col4
0 -0.480144 1.463995 0.454819 -1.531419
1 -0.418552 -0.225754 -0.931259 -0.534846
2 -0.028083 -0.420394 0.925346 0.975792
3 -0.144064 -0.811569 -0.013452 0.110480
4 -0.966490 -0.822555 0.228038 -0.149852
5 -0.017370 -0.538245 -2.083904 0.230733
col1 col2 col3 col4
0 -0.480144 1.463995 0.454819 -1.531419
1 -0.418552 -0.538245 -0.931259 -0.534846
2 -0.028083 -0.420394 0.925346 0.975792
3 -0.144064 -0.811569 -0.013452 0.110480
4 -0.966490 -0.822555 0.228038 0.110480
5 -0.017370 -0.538245 -2.083904 0.230733
另外,如果是直接替换为特定值,也可以考虑用pandas的replace功能,例如本示例可直接使用df.replace(np.nan,0),这种方法简单粗暴,但也能达到效果。当然replace的出现是为了解决各种替换用的,缺失值只是其中一种应用而已。
到此这篇关于python sklearn与pandas实现缺失值数据预处理流程详解的文章就介绍到这了,更多相关python 数据预处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?