一:处理缺失数
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() 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 异常值的最小值为: nan3.箱型图分析法
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())年龄的最小值为 3.0 年龄的最大值为 96.0 地区的最小值为 4.0 地区的最大值为 110.0欢迎分享,转载请注明来源:内存溢出
评论列表(0条)