python大数据的数据清洗和准备(对缺失值的处理,对重复数据的处理,对异常值的处理,数据转换)

一:处理缺失数

import numpy as np
import pandas as pd


df=pd.DataFrame(np.random.randn(10,6))
df.iloc[:4,1]=None
df.iloc[:2,4:6]=None
df.iloc[6,3:5]=None
df.iloc[8,0:2]=None
print(df)

# 判断缺失值
# 元素级别的判断,把对应所有元素的位置都列出来,元素为空或者NA就显示true,否则就是False
result=df.isnull()
print(result)
# 列级别的判断,只要该列有空,或者NA,就为True,否则为False
result=df.isnull().any()
print(result)
# 只显示具有缺失值的行列,清楚的确定缺失值的位置
# 用drop_duplicates()去掉重复的行
result=df[df.isnull().values==True].drop_duplicates();
print(result)
# 获得为空或者NA的列索引
result=df.columns[df.isnull().any()==True]
print(result)
# 获得每列为空的数据的个数
num=df.isnull().sum()
print(num)
# 获得每行为空的数据的个数
num=df.isnull().sum(axis=1)
print(num)
          0         1         2         3         4         5
0 -0.007384       NaN -0.080993 -1.237227       NaN       NaN
1  1.714427       NaN  0.150938  0.911013       NaN       NaN
2 -0.277183       NaN -0.730419 -0.439043  0.392371  0.290128
3 -1.480452       NaN  3.166166 -0.514042  0.179483  0.020033
4  0.151948 -1.710320 -0.400083 -0.157654  1.094303 -0.343649
5  0.760926  0.029076  0.460996 -0.734838  0.887533  0.730887
6 -0.552344 -1.129041  1.132274       NaN       NaN  0.200584
7  0.369075  0.311318 -0.651598 -0.382182 -0.607464 -0.219942
8       NaN       NaN -0.502302  0.179766  0.461502 -1.395001
9 -0.696918 -1.230387  1.368480 -0.794495  0.838037 -0.314962
       0      1      2      3      4      5
0  False   True  False  False   True   True
1  False   True  False  False   True   True
2  False   True  False  False  False  False
3  False   True  False  False  False  False
4  False  False  False  False  False  False
5  False  False  False  False  False  False
6  False  False  False   True   True  False
7  False  False  False  False  False  False
8   True   True  False  False  False  False
9  False  False  False  False  False  False
0     True
1     True
2    False
3     True
4     True
5     True
dtype: bool
          0         1         2         3         4         5
0 -0.007384       NaN -0.080993 -1.237227       NaN       NaN
1  1.714427       NaN  0.150938  0.911013       NaN       NaN
2 -0.277183       NaN -0.730419 -0.439043  0.392371  0.290128
3 -1.480452       NaN  3.166166 -0.514042  0.179483  0.020033
6 -0.552344 -1.129041  1.132274       NaN       NaN  0.200584
8       NaN       NaN -0.502302  0.179766  0.461502 -1.395001
Int64Index([0, 1, 3, 4, 5], dtype='int64')
0    1
1    5
2    0
3    1
4    3
5    2
dtype: int64
0    3
1    3
2    1
3    1
4    0
5    0
6    2
7    0
8    2
9    0
dtype: int64

处理缺省值:

使用dropna删除缺省值

语法:DataFrame.dropna(axis=0,how='any',thresh='None',subset=None,inplace=False)

dropna参数介绍:axis表示滤除维度,aixs等于0代表行,等于1代表列;how等于“all“表示这一或列行的数据全部缺失参删除这一行,”any“表示这一行或列的数据只要有缺失就删除;thresh一行或一列中出现了规定数量的非NaN才保留;subset在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值的列或行不会删除;inplace刷选过缺失值的新数据是存为副本还是直接在源数据上进行修改刷选过缺失值的新数据是存为副本还是直接在原数据上改。

# 滤除缺失值
# 使用默认参数,删除行,只要有空值就会删除,不改变源数据
print(df.dropna())
print(df)
# 删除带有空值的列
print(df.dropna(axis=1))
# 所有值为缺失值才删除
print(df.dropna(how="all"))
# 有缺失值就删除
print(df.dropna(how="any"))
# 至少有四个非空值才保留
print(df.dropna(thresh=4))
# 删除这个subset含有缺失值的行
print(df.dropna(subset=[2,4]))
# 删除这个subset含有缺失值的列
print(df.dropna(subset=[2,4],axis=1))

输出:

          0         1         2         3         4         5
0  0.143259       NaN  2.419748 -1.712697       NaN       NaN
1  0.515429       NaN  0.470343 -0.177863       NaN       NaN
2  0.610779       NaN -0.221009 -0.237788 -0.629379 -0.529702
3 -0.637151       NaN -0.459291  0.999029  0.433639 -0.497081
4  0.569829  2.041052  1.439950 -1.964652 -0.039753  1.638609
5  0.029131 -1.415857 -0.574515 -0.294378 -1.346518  0.656803
6 -0.030463  1.811147 -0.125022       NaN       NaN -0.893244
7 -1.657536  1.626802  1.716550 -0.612455 -1.363458 -0.227734
8       NaN       NaN  1.240417  0.481174  0.913906  0.024055
9 -1.392998  0.127723 -0.204323 -0.705202 -0.709875  0.886038
          0         1         2         3         4         5
4  0.569829  2.041052  1.439950 -1.964652 -0.039753  1.638609
5  0.029131 -1.415857 -0.574515 -0.294378 -1.346518  0.656803
7 -1.657536  1.626802  1.716550 -0.612455 -1.363458 -0.227734
9 -1.392998  0.127723 -0.204323 -0.705202 -0.709875  0.886038
          0         1         2         3         4         5
0  0.143259       NaN  2.419748 -1.712697       NaN       NaN
1  0.515429       NaN  0.470343 -0.177863       NaN       NaN
2  0.610779       NaN -0.221009 -0.237788 -0.629379 -0.529702
3 -0.637151       NaN -0.459291  0.999029  0.433639 -0.497081
4  0.569829  2.041052  1.439950 -1.964652 -0.039753  1.638609
5  0.029131 -1.415857 -0.574515 -0.294378 -1.346518  0.656803
6 -0.030463  1.811147 -0.125022       NaN       NaN -0.893244
7 -1.657536  1.626802  1.716550 -0.612455 -1.363458 -0.227734
8       NaN       NaN  1.240417  0.481174  0.913906  0.024055
9 -1.392998  0.127723 -0.204323 -0.705202 -0.709875  0.886038
          2
0  2.419748
1  0.470343
2 -0.221009
3 -0.459291
4  1.439950
5 -0.574515
6 -0.125022
7  1.716550
8  1.240417
9 -0.204323
          0         1         2         3         4         5
0  0.143259       NaN  2.419748 -1.712697       NaN       NaN
1  0.515429       NaN  0.470343 -0.177863       NaN       NaN
2  0.610779       NaN -0.221009 -0.237788 -0.629379 -0.529702
3 -0.637151       NaN -0.459291  0.999029  0.433639 -0.497081
4  0.569829  2.041052  1.439950 -1.964652 -0.039753  1.638609
5  0.029131 -1.415857 -0.574515 -0.294378 -1.346518  0.656803
6 -0.030463  1.811147 -0.125022       NaN       NaN -0.893244
7 -1.657536  1.626802  1.716550 -0.612455 -1.363458 -0.227734
8       NaN       NaN  1.240417  0.481174  0.913906  0.024055
9 -1.392998  0.127723 -0.204323 -0.705202 -0.709875  0.886038
          0         1         2         3         4         5
4  0.569829  2.041052  1.439950 -1.964652 -0.039753  1.638609
5  0.029131 -1.415857 -0.574515 -0.294378 -1.346518  0.656803
7 -1.657536  1.626802  1.716550 -0.612455 -1.363458 -0.227734
9 -1.392998  0.127723 -0.204323 -0.705202 -0.709875  0.886038
          0         1         2         3         4         5
2  0.610779       NaN -0.221009 -0.237788 -0.629379 -0.529702
3 -0.637151       NaN -0.459291  0.999029  0.433639 -0.497081
4  0.569829  2.041052  1.439950 -1.964652 -0.039753  1.638609
5  0.029131 -1.415857 -0.574515 -0.294378 -1.346518  0.656803
6 -0.030463  1.811147 -0.125022       NaN       NaN -0.893244
7 -1.657536  1.626802  1.716550 -0.612455 -1.363458 -0.227734
8       NaN       NaN  1.240417  0.481174  0.913906  0.024055
9 -1.392998  0.127723 -0.204323 -0.705202 -0.709875  0.886038
          0         1         2         3         4         5
2  0.610779       NaN -0.221009 -0.237788 -0.629379 -0.529702
3 -0.637151       NaN -0.459291  0.999029  0.433639 -0.497081
4  0.569829  2.041052  1.439950 -1.964652 -0.039753  1.638609
5  0.029131 -1.415857 -0.574515 -0.294378 -1.346518  0.656803
7 -1.657536  1.626802  1.716550 -0.612455 -1.363458 -0.227734
8       NaN       NaN  1.240417  0.481174  0.913906  0.024055
9 -1.392998  0.127723 -0.204323 -0.705202 -0.709875  0.886038
          0         2         3         4         5
0  0.143259  2.419748 -1.712697       NaN       NaN
1  0.515429  0.470343 -0.177863       NaN       NaN
2  0.610779 -0.221009 -0.237788 -0.629379 -0.529702
3 -0.637151 -0.459291  0.999029  0.433639 -0.497081
4  0.569829  1.439950 -1.964652 -0.039753  1.638609
5  0.029131 -0.574515 -0.294378 -1.346518  0.656803
6 -0.030463 -0.125022       NaN       NaN -0.893244
7 -1.657536  1.716550 -0.612455 -1.363458 -0.227734
8       NaN  1.240417  0.481174  0.913906  0.024055
9 -1.392998 -0.204323 -0.705202 -0.709875  0.886038

2:填充缺失数据

使用fillna函数填充数据

DataFrame.fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs)

参数介绍:value:表示填充的数值;axis表示填充的维度,0代表行;method等于fill表示用前面一个缺失值填充,如果axis等于0,就用横向的前面的值替换后面的缺失值,如果ais等于1,就用上面的代替下面的缺失值,注意这个参数不能与value同时出现;limit确定填充的个数,如果limit等于2就填充两个值。

print(df.fillna(axis=1,method="ffill"))
# 不同的列使用不同的值填充
info={0:0,1:1,2:2,3:3,4:4,5:5}
print(df.fillna(value=info))
# 对每列的替换值有替换次数
print(df.fillna(value=info,limit=1))
输出:
          0         1         2         3         4         5
0  0.272305  0.272305  0.263546  1.284545  1.284545  1.284545
1 -0.355460 -0.355460 -1.098625  0.115647  0.115647  0.115647
2 -1.146679 -1.146679  0.276313  1.014488 -0.792359  1.249953
3 -0.278821 -0.278821  0.982816  0.219435  0.147744  0.718356
4  0.653708 -0.241576 -1.123370  0.585324 -2.305213  0.571846
5 -0.148483 -0.244243 -1.305794  0.401676  0.407405  0.348419
6  0.618088 -0.305534 -2.259295 -2.259295 -2.259295  1.565090
7  0.726626 -1.925620  0.785143 -0.578770 -0.055749 -2.569170
8       NaN       NaN  0.217508  0.425285 -0.746134  0.207701
9  1.263890  0.034396  0.593998 -0.006390 -0.148880  0.088589
          0         1         2         3         4         5
0  0.272305  1.000000  0.263546  1.284545  4.000000  5.000000
1 -0.355460  1.000000 -1.098625  0.115647  4.000000  5.000000
2 -1.146679  1.000000  0.276313  1.014488 -0.792359  1.249953
3 -0.278821  1.000000  0.982816  0.219435  0.147744  0.718356
4  0.653708 -0.241576 -1.123370  0.585324 -2.305213  0.571846
5 -0.148483 -0.244243 -1.305794  0.401676  0.407405  0.348419
6  0.618088 -0.305534 -2.259295  3.000000  4.000000  1.565090
7  0.726626 -1.925620  0.785143 -0.578770 -0.055749 -2.569170
8  0.000000  1.000000  0.217508  0.425285 -0.746134  0.207701
9  1.263890  0.034396  0.593998 -0.006390 -0.148880  0.088589
          0         1         2         3         4         5
0  0.272305  1.000000  0.263546  1.284545  4.000000  5.000000
1 -0.355460       NaN -1.098625  0.115647       NaN       NaN
2 -1.146679       NaN  0.276313  1.014488 -0.792359  1.249953
3 -0.278821       NaN  0.982816  0.219435  0.147744  0.718356
4  0.653708 -0.241576 -1.123370  0.585324 -2.305213  0.571846
5 -0.148483 -0.244243 -1.305794  0.401676  0.407405  0.348419
6  0.618088 -0.305534 -2.259295  3.000000       NaN  1.565090
7  0.726626 -1.925620  0.785143 -0.578770 -0.055749 -2.569170
8  0.000000       NaN  0.217508  0.425285 -0.746134  0.207701
9  1.263890  0.034396  0.593998 -0.006390 -0.148880  0.088589

二:处理重复数据

1.判断重复数据

 

DataFrame.duplicated(subset=None,keep='first')

参数:subset:接受string或者sequence,指定判断重复的列;keep:接收特定的string,标记重复的行:First:除了第一个,其他的全部标记为True;Last:除了最后一个,其他的全部标记为True。False:重复的标记为True,默认为first

该函数的返回值为:一个布尔类型的Series,表示各行是否是重复行。

df={'k1':['one','two']*3+['two']*2,'k2':[1,1,2,3,3,4,4,4]}
df=pd.DataFrame(df)
print(df)
# keep的默认值为frist
print(df.duplicated())
# 判断重复数据行,全部标记为True
print(df.duplicated(keep=False))
# 指定判断重复的列
print(df.duplicated(subset="k1"))

输出:

    k1  k2
0  one   1
1  two   1
2  one   2
3  two   3
4  one   3
5  two   4
6  two   4
7  two   4
0    False
1    False
2    False
3    False
4    False
5    False
6     True
7     True
dtype: bool
0    False
1    False
2    False
3    False
4    False
5     True
6     True
7     True
dtype: bool
0    False
1    False
2     True
3     True
4     True
5     True
6     True
7     True
dtype: bool

2.删除重复的数据

使用DataFrame.drop_duplicates(subset=None,keep="first",inplace=False)

参数:subset接收string或者sequence,表示去重的列,默认为None,表示全部列;keep接收特定的string,表示重复时保留第几个数据,First表示保留第一个,Last表示保留最后一个,False表示不保留;inplace接收boolean,表示是否在原表上进行操作,默认为False

print(df)
# 删除重复的数据
print(df.drop_duplicates())
# 删除指定重复的行
print(df.drop_duplicates(subset="k1"))

输出:

    k1  k2
0  one   1
1  two   1
2  one   2
3  two   3
4  one   3
5  two   4
6  two   4
7  two   4
    k1  k2
0  one   1
1  two   1
2  one   2
3  two   3
4  one   3
5  two   4
    k1  k2
0  one   1
1  two   1

3.处理特征重复值

import numpy as np
import pandas as pd
from sqlalchemy import create_engine

conn=create_engine('mysql+pymysql://root:root@localhost:3306/shujv')
result=pd.read_sql('select * from 日照 limit 100',con=conn)
print(result)
# 判断医保前后数据的相关度
corr_info=result[['ZFY','TCFY']].corr(method='pearson')
print(corr_info)

# 定义求取特征是否完全相同的矩阵的函数
def FeatureEquals(df):
    dfEquals=pd.DataFrame([],columns=df.columns,index=df.columns)
    print(df.iloc[:10])
    print(df.iloc[:10])
    for i in df.columns:
        for j in df.columns:
            dfEquals.loc[i,j]=df.loc[:,i].equals(df.loc[:j])
    return dfEquals
detEqulas=FeatureEquals(result)
print("detail的特征相等矩阵为",detEqulas)

# 遍历所用的数据
len_num=detEqulas.shape[0]
# print(len_num)
print("hello world")
print(detEqulas.columns[1])
dupCol=[]
for k in range(len_num):
    for l in range(k+1,len_num):
        if detEqulas.iloc[k,1] & (detEqulas.columns[1] not in dupCol):
            dupCol.append(detEqulas.columns[1])

# 进行去重操作
print("需要删除的列为",dupCol)
result.drop(dupCol,axis=1,inplace=True)
print("删除多余列后df的特征数目为",result.shape[1])
                      ID  NL XB RYLB  ...     TCFY  SUM                JSRQ   JDMC
0           371100420317  19  男   居民  ...     16.0  1.0  2021/8/21 10:08:44  北京路街道
1           371103916127  52  女   居民  ...     20.0  1.0  2021/8/10 17:47:22  卧龙山街道
2           371103916127  52  女   居民  ...      8.0  1.0  2021/9/14 18:04:31  卧龙山街道
3           371103916127  52  女   居民  ...      8.0  1.0  2021/9/15 18:30:58  卧龙山街道
4           371103916127  52  女   居民  ...      6.0  1.0  2021/9/19 17:49:08  卧龙山街道
..                   ...  .. ..  ...  ...      ...  ...                 ...    ...
95  12118111510072663096   5  女   居民  ...     11.0  1.0    2021/9/8 9:51:41       
96  12118111510072663096   5  女   居民  ...     80.0  1.0   2021/9/7 17:41:30       
97  12118111210072617255  50  男   在职  ...    647.0  1.0   2021/8/24 9:43:36       
98  12118111210072617255  50  男   在职  ...  11617.0  1.0  2021/8/30 10:34:16       
99  12118111210072617255  51  男   在职  ...    647.0  1.0  2021/9/23 16:01:37       

[100 rows x 16 columns]
           ZFY      TCFY
ZFY   1.000000  0.992167
TCFY  0.992167  1.000000
             ID  NL XB RYLB  YLLB  ...   ZFY  TCFY  SUM                JSRQ   JDMC
0  371100420317  19  男   居民  普通门诊  ...  36.0  16.0  1.0  2021/8/21 10:08:44  北京路街道
1  371103916127  52  女   居民  普通门诊  ...  41.0  20.0  1.0  2021/8/10 17:47:22  卧龙山街道
2  371103916127  52  女   居民  普通门诊  ...  18.0   8.0  1.0  2021/9/14 18:04:31  卧龙山街道
3  371103916127  52  女   居民  普通门诊  ...  17.0   8.0  1.0  2021/9/15 18:30:58  卧龙山街道
4  371103916127  52  女   居民  普通门诊  ...  15.0   6.0  1.0  2021/9/19 17:49:08  卧龙山街道
5  371100479496  26  女   在职  普通门诊  ...  35.0  16.0  1.0  2021/8/20 15:58:25       
6  371101577905  53  男   在职  普通门诊  ...  19.0   9.0  1.0   2021/9/7 17:15:14       
7  371100923941  29  女   在职  普通门诊  ...   9.0   4.0  1.0   2021/9/4 17:11:46       
8  371100923941  29  女   在职  普通门诊  ...  18.0   8.0  1.0   2021/9/5 15:25:52       
9  371101716677  68  男   居民  普通门诊  ...   6.0   3.0  1.0  2021/8/14 16:46:35    三庄镇

[10 rows x 16 columns]
             ID  NL XB RYLB  YLLB  ...   ZFY  TCFY  SUM                JSRQ   JDMC
0  371100420317  19  男   居民  普通门诊  ...  36.0  16.0  1.0  2021/8/21 10:08:44  北京路街道
1  371103916127  52  女   居民  普通门诊  ...  41.0  20.0  1.0  2021/8/10 17:47:22  卧龙山街道
2  371103916127  52  女   居民  普通门诊  ...  18.0   8.0  1.0  2021/9/14 18:04:31  卧龙山街道
3  371103916127  52  女   居民  普通门诊  ...  17.0   8.0  1.0  2021/9/15 18:30:58  卧龙山街道
4  371103916127  52  女   居民  普通门诊  ...  15.0   6.0  1.0  2021/9/19 17:49:08  卧龙山街道
5  371100479496  26  女   在职  普通门诊  ...  35.0  16.0  1.0  2021/8/20 15:58:25       
6  371101577905  53  男   在职  普通门诊  ...  19.0   9.0  1.0   2021/9/7 17:15:14       
7  371100923941  29  女   在职  普通门诊  ...   9.0   4.0  1.0   2021/9/4 17:11:46       
8  371100923941  29  女   在职  普通门诊  ...  18.0   8.0  1.0   2021/9/5 15:25:52       
9  371101716677  68  男   居民  普通门诊  ...   6.0   3.0  1.0  2021/8/14 16:46:35    三庄镇

[10 rows x 16 columns]
detail的特征相等矩阵为          ID     NL     XB   RYLB   YLLB  ...    ZFY   TCFY    SUM   JSRQ   JDMC
ID    False  False  False  False  False  ...  False  False  False  False  False
NL    False  False  False  False  False  ...  False  False  False  False  False
XB    False  False  False  False  False  ...  False  False  False  False  False
RYLB  False  False  False  False  False  ...  False  False  False  False  False
YLLB  False  False  False  False  False  ...  False  False  False  False  False
RYQH  False  False  False  False  False  ...  False  False  False  False  False
JZQH  False  False  False  False  False  ...  False  False  False  False  False
JGDJ  False  False  False  False  False  ...  False  False  False  False  False
RYRQ  False  False  False  False  False  ...  False  False  False  False  False
CYRQ  False  False  False  False  False  ...  False  False  False  False  False
ZDMC  False  False  False  False  False  ...  False  False  False  False  False
ZFY   False  False  False  False  False  ...  False  False  False  False  False
TCFY  False  False  False  False  False  ...  False  False  False  False  False
SUM   False  False  False  False  False  ...  False  False  False  False  False
JSRQ  False  False  False  False  False  ...  False  False  False  False  False
JDMC  False  False  False  False  False  ...  False  False  False  False  False

[16 rows x 16 columns]
hello world
NL
需要删除的列为 []
删除多余列后df的特征数目为 16

三:处理异常数据

1.简单的统计分析

num={'name':['wangchon','liyang','liuyi']*3+['heiye']*3,'age':np.random.randint(1,10,size=12)}
df=pd.DataFrame(num)
print(df)
print(df.duplicated(keep=False))
print(df.duplicated())
        name  age
0   wangchon    9
1     liyang    7
2      liuyi    6
3   wangchon    5
4     liyang    1
5      liuyi    6
6   wangchon    3
7     liyang    7
8      liuyi    1
9      heiye    8
10     heiye    4
11     heiye    9
0     False
1      True
2      True
3     False
4     False
5      True
6     False
7      True
8     False
9     False
10    False
11    False
dtype: bool
0     False
1     False
2     False
3     False
4     False
5      True
6     False
7      True
8     False
9     False
10    False
11    False
dtype: bool

2.3σ法则

import numpy as np
import pandas as pd
from sqlalchemy import create_engine

conn=create_engine('mysql+pymysql://root:root@localhost:3306/shujv')
df=pd.read_sql('select * from 日照 limit 100',con=conn)

df.loc[:20,'NL']=None
print(df)
# 定义3σ原则识别异常值函数
def outRange(Ser1):
    boolInd = (Ser1.mean()-3*Ser1.std()>Ser1) | (Ser1.mean()+3*Ser1.var()<Ser1)
    print(boolInd)
    index=np.arange(len(Ser1))[boolInd]
    outRange = Ser1.iloc[index]
    return outRange
outlier=outRange(df['NL'])
print("使用3σ法则判断异常值的个数为",len(outlier))
print("异常值的最大值为:",outlier.max())
print("异常值的最小值为:",outlier.min())

              ID    NL XB RYLB  ...     TCFY  SUM                JSRQ   JDMC
0   3.711004e+11   1.0  男   居民  ...     16.0  1.0  2021/8/21 10:08:44  北京路街道
1   3.711039e+11   1.0  女   居民  ...     20.0  1.0  2021/8/10 17:47:22  卧龙山街道
2   3.711039e+11   1.0  女   居民  ...      8.0  1.0  2021/9/14 18:04:31  卧龙山街道
3   3.711039e+11   1.0  女   居民  ...      8.0  1.0  2021/9/15 18:30:58  卧龙山街道
4   3.711039e+11   1.0  女   居民  ...      6.0  1.0  2021/9/19 17:49:08  卧龙山街道
..           ...   ... ..  ...  ...      ...  ...                 ...    ...
95  1.211811e+19   5.0  女   居民  ...     11.0  1.0    2021/9/8 9:51:41       
96  1.211811e+19   5.0  女   居民  ...     80.0  1.0   2021/9/7 17:41:30       
97  1.211811e+19  50.0  男   在职  ...    647.0  1.0   2021/8/24 9:43:36       
98  1.211811e+19  50.0  男   在职  ...  11617.0  1.0  2021/8/30 10:34:16       
99  1.211811e+19  51.0  男   在职  ...    647.0  1.0  2021/9/23 16:01:37       

[100 rows x 16 columns]
0     False
1     False
2     False
3     False
4     False
      ...  
95    False
96    False
97    False
98    False
99    False
Name: NL, Length: 100, dtype: bool
使用3σ法则判断异常值的个数为 0
异常值的最大值为: nan
异常值的最小值为: nan

3.箱型图分析法

import numpy as np
import pandas as pd
from sqlalchemy import create_engine
# 箱型图分析
# 定义异常值识别和处理函数
def out_range(ser):
    QL=ser.quantile(0.25)
    QU=ser.quantile(0.75)
    IQR=QU+QL
#     超过上界的取上界,
    ser.loc[ser>(QL+1.5*IQR)]=QU
#     低于下界的取下界
    ser.loc[ser<(QL-1.5*IQR)]=QL
    return ser;
# 处理年龄和地区的异常值
df['NL']=out_range(df['NL'])
df['ZFY']=out_range(df['ZFY'])
# 查看处理后的年龄和地区的最大值,最小值
print("年龄的最小值为",df['NL'].min())
print("年龄的最大值为",df['NL'].max())
print("地区的最小值为",df['ZFY'].min())
print("地区的最大值为",df['ZFY'].max())

四:数据转换

1.利用函数或者映射进行数据转换


df=pd.DataFrame({'food':['Bacon','pulled pork' ,'bacon','Pastrami','cornede beef','Bacon','pastrami','hoey ham','nova lox'],'ounces':[4,3,12,6,7,5,8,3,5]})
print(df)
# 添加一列表示该肉类食物来源的动物类型
animals={'bacon':'pig','pulled pork':'pig','pastrami':'cow','cornede beef':'com','hoey ham':'pig','nova lox':'salmon'}
# 使用Series把food这一行都变成小写
lower=df['food'].str.lower();
# 建立一个新的类,使用map方法,进行赋值
df["animal"]=lower.map(animals)
print(df)

# 应用函数实现
df["animal_2"]=df['food'].map(lambda x:animals[x.lower()])
print(df)

# 2.replace方法替换值
data=pd.Series([1,-999,2,-999,-1000,3,-1000])
# 将-999替换成NA值
print(data.replace(-999,np.nan))
# 可以每个只有不同的替换值,传入一个替换列表
print(data.replace([-999,-1000],[np.nan,0]))

# 3.重命名轴索引
data=pd.DataFrame(np.arange(12).reshape((3,4)),index=['Ohio','Colorado','New York'],columns=['one','two','three','four'])
print(data)
# 修改横轴索引,取原索引的前四位并大写
data.index=data.index.map(lambda x:x[:4].upper())
print(data)
# 使用renma 方法也可以实现,修改纵轴的索引
data.rename(index=str.title,columns=str.upper,inplace=True)
print(data)

输出:

           food  ounces
0         Bacon       4
1   pulled pork       3
2         bacon      12
3      Pastrami       6
4  cornede beef       7
5         Bacon       5
6      pastrami       8
7      hoey ham       3
8      nova lox       5
           food  ounces  animal
0         Bacon       4     pig
1   pulled pork       3     pig
2         bacon      12     pig
3      Pastrami       6     cow
4  cornede beef       7     com
5         Bacon       5     pig
6      pastrami       8     cow
7      hoey ham       3     pig
8      nova lox       5  salmon
           food  ounces  animal animal_2
0         Bacon       4     pig      pig
1   pulled pork       3     pig      pig
2         bacon      12     pig      pig
3      Pastrami       6     cow      cow
4  cornede beef       7     com      com
5         Bacon       5     pig      pig
6      pastrami       8     cow      cow
7      hoey ham       3     pig      pig
8      nova lox       5  salmon   salmon
0       1.0
1       NaN
2       2.0
3       NaN
4   -1000.0
5       3.0
6   -1000.0
dtype: float64
0    1.0
1    NaN
2    2.0
3    NaN
4    0.0
5    3.0
6    0.0
dtype: float64
          one  two  three  four
Ohio        0    1      2     3
Colorado    4    5      6     7
New York    8    9     10    11
      one  two  three  four
OHIO    0    1      2     3
COLO    4    5      6     7
NEW     8    9     10    11
      ONE  TWO  THREE  FOUR
Ohio    0    1      2     3
Colo    4    5      6     7
New     8    9     10    11

2.哑变量处理

使用get_dummies函数对类别型特征进行哑变量处理

pandas.get_dummies(data,prefix=None,prefix_sep='_',dummy_na=False,columns=None,sparse=False,drop_first=False)

import numpy as np
import pandas as pd

num=['pyacharm','Ideaa','yehsen','moniqi','zhonguo','ren']
df=pd.DataFrame(num)
print("哑变量处理前的数据",df)
print("哑变量处理后的数据",pd.get_dummies(df))

输出:

哑变量处理前的数据           0
0  pyacharm
1     Ideaa
2    yehsen
3    moniqi
4   zhonguo
5       ren
哑变量处理后的数据    0_Ideaa  0_moniqi  0_pyacharm  0_ren  0_yehsen  0_zhonguo
0        0         0           1      0         0          0
1        1         0           0      0         0          0
2        0         0           0      0         1          0
3        0         1           0      0         0          0
4        0         0           0      0         0          1
5        0         0           0      1         0          0

猜你喜欢

转载自blog.csdn.net/qq_51269815/article/details/121502431