数据清洗:因为数据中出现了异常值,需要将异常值剔除
一 处理丢失数据:
两种丢失数据:
None
np.nan或者np.NaN
二者的区别:
前者的数据类型是NoneType,后者是float类型
注意:
空值nan与任何值运算返回的还是nan
None在pandas中可以强制转换成NAN形式
(1)想要将数据为空值的行需要删除用到的
方法一:
1、导入pandas和numpy包
2、使用数据.isfull()函数得到bool值,判定数据里面是否有空值,如果有返回True,否则返回false
3、使用any(axis=)函数,axis=0或者1选择0是纵向,选择1为行,为0就会得到有几列有True值,1就会得到有几行有True值
4、使用loc()函数,将带有空值的行窃取出来
5、使用drop()函数删除带有空的行
实现如下:
import pandas as pd
import numpy as np
from pandas import DataFrame
df = DataFrame(data=np.random.randint(0, 100, size=(10, 10)))
print(df)
df.iloc[2, 3] = None
df.iloc[4, 5] = np.nan
df.iloc[6, 6] = np.NAN
df.loc[6, 4] = None
print(df)
df1 = df.isnull()
print(df1)
# any作用到df.isnull()返回的DataFrame的行中
df1_get_row_none = df1.any(axis=1)
print(df1_get_row_none)
df1_get_colum_none = df1.any(axis=0)
print(df1_get_colum_none)
df_row_clear = df.loc[df1_get_row_none]
print(df_row_clear.index)
df.drop(labels=df_row_clear.index,axis=0,inplace=True)
print(df)
结果是:
D:\*******************************************\数据清洗.py
0 1 2 3 4 5 6 7 8 9
0 22 68 76 25 43 21 32 91 5 60
1 21 33 77 11 88 64 41 84 84 37
2 17 67 96 58 51 92 26 83 31 86
3 5 55 14 53 86 6 39 33 88 21
4 50 5 74 99 56 42 42 76 79 14
5 73 2 57 69 85 22 95 8 14 38
6 60 40 6 28 82 98 33 98 7 11
7 23 28 19 2 26 80 82 22 71 16
8 46 8 98 18 18 1 99 55 83 21
9 40 2 72 78 59 64 75 76 96 39
0 1 2 3 4 5 6 7 8 9
0 22 68 76 25.0 43.0 21.0 32.0 91 5 60
1 21 33 77 11.0 88.0 64.0 41.0 84 84 37
2 17 67 96 NaN 51.0 92.0 26.0 83 31 86
3 5 55 14 53.0 86.0 6.0 39.0 33 88 21
4 50 5 74 99.0 56.0 NaN 42.0 76 79 14
5 73 2 57 69.0 85.0 22.0 95.0 8 14 38
6 60 40 6 28.0 NaN 98.0 NaN 98 7 11
7 23 28 19 2.0 26.0 80.0 82.0 22 71 16
8 46 8 98 18.0 18.0 1.0 99.0 55 83 21
9 40 2 72 78.0 59.0 64.0 75.0 76 96 39
0 1 2 3 4 5 6 7 8 9
0 False False False False False False False False False False
1 False False False False False False False False False False
2 False False False True False False False False False False
3 False False False False False False False False False False
4 False False False False False True False False False False
5 False False False False False False False False False False
6 False False False False True False True False False False
7 False False False False False False False False False False
8 False False False False False False False False False False
9 False False False False False False False False False False
0 False
1 False
2 True
3 False
4 True
5 False
6 True
7 False
8 False
9 False
dtype: bool
0 False
1 False
2 False
3 True
4 True
5 True
6 True
7 False
8 False
9 False
dtype: bool
Int64Index([2, 4, 6], dtype='int64')
0 1 2 3 4 5 6 7 8 9
0 22 68 76 25.0 43.0 21.0 32.0 91 5 60
1 21 33 77 11.0 88.0 64.0 41.0 84 84 37
3 5 55 14 53.0 86.0 6.0 39.0 33 88 21
5 73 2 57 69.0 85.0 22.0 95.0 8 14 38
7 23 28 19 2.0 26.0 80.0 82.0 22 71 16
8 46 8 98 18.0 18.0 1.0 99.0 55 83 21
9 40 2 72 78.0 59.0 64.0 75.0 76 96 39
Process finished with exit code 0
还可以将第一种的any换成all并进行其他操作,
all代表的是否全是True
import pandas as pd
import numpy as np
from pandas import DataFrame
df = DataFrame(data=np.random.randint(0, 100, size=(10, 10)))
print(df)
df.loc[2, 2] = None
df.loc[3, 3] = None
df.loc[8, 8] = np.NAN
df.loc[9, 1] = np.nan
print(df)
df1 = df.notnull()
print(df1)
df1_row = df1.all(axis=1)
print(df1_row)
df1_row_date = df.loc[df1_row]
print(df1_row_date)
结果是:
0 1 2 3 4 5 6 7 8 9
0 42 1 78 58 87 66 42 1 63 56
1 66 75 56 84 52 78 81 19 41 49
2 45 25 1 93 50 41 61 61 15 91
3 35 40 7 85 22 32 78 22 73 0
4 82 10 31 75 20 7 14 59 17 18
5 81 51 70 60 7 67 29 29 34 17
6 49 70 54 48 82 92 34 76 17 16
7 43 96 68 53 96 69 54 15 68 6
8 36 28 74 4 68 24 48 89 79 73
9 74 11 24 71 53 65 86 61 7 59
0 1 2 3 4 5 6 7 8 9
0 42 1.0 78.0 58.0 87 66 42 1 63.0 56
1 66 75.0 56.0 84.0 52 78 81 19 41.0 49
2 45 25.0 NaN 93.0 50 41 61 61 15.0 91
3 35 40.0 7.0 NaN 22 32 78 22 73.0 0
4 82 10.0 31.0 75.0 20 7 14 59 17.0 18
5 81 51.0 70.0 60.0 7 67 29 29 34.0 17
6 49 70.0 54.0 48.0 82 92 34 76 17.0 16
7 43 96.0 68.0 53.0 96 69 54 15 68.0 6
8 36 28.0 74.0 4.0 68 24 48 89 NaN 73
9 74 NaN 24.0 71.0 53 65 86 61 7.0 59
0 1 2 3 4 5 6 7 8 9
0 True True True True True True True True True True
1 True True True True True True True True True True
2 True True False True True True True True True True
3 True True True False True True True True True True
4 True True True True True True True True True True
5 True True True True True True True True True True
6 True True True True True True True True True True
7 True True True True True True True True True True
8 True True True True True True True True False True
9 True False True True True True True True True True
0 True
1 True
2 False
3 False
4 True
5 True
6 True
7 True
8 False
9 False
dtype: bool
0 1 2 3 4 5 6 7 8 9
0 42 1.0 78.0 58.0 87 66 42 1 63.0 56
1 66 75.0 56.0 84.0 52 78 81 19 41.0 49
4 82 10.0 31.0 75.0 20 7 14 59 17.0 18
5 81 51.0 70.0 60.0 7 67 29 29 34.0 17
6 49 70.0 54.0 48.0 82 92 34 76 17.0 16
7 43 96.0 68.0 53.0 96 69 54 15 68.0 6
Process finished with exit code 0
有两个固定搭配:
isnull 用 any
notnull用all
第二种办法:
直接使用dropna函数
import numpy as np
from pandas import DataFrame
df = DataFrame(data=np.random.randint(0, 100, size=(10, 10)))
print(df)
df.loc[2, 2] = None
df.loc[3, 3] = None
df.loc[8, 8] = np.NAN
df.loc[9, 1] = np.nan
df = df.dropna(axis=0)
print(df)
输出结果:
0 1 2 3 4 5 6 7 8 9
0 10 75 9 84 24 47 47 58 81 92
1 82 57 30 62 20 9 29 20 74 18
2 25 53 81 27 57 41 62 53 40 8
3 19 85 16 22 96 94 20 35 39 20
4 10 73 4 82 21 25 66 84 97 57
5 69 52 82 58 98 42 56 54 6 11
6 50 17 32 27 22 11 0 84 3 9
7 70 40 75 80 57 61 85 94 72 50
8 8 97 25 47 58 55 51 78 81 80
9 28 94 78 69 70 43 18 39 11 94
0 1 2 3 4 5 6 7 8 9
0 10 75.0 9.0 84.0 24 47 47 58 81.0 92
1 82 57.0 30.0 62.0 20 9 29 20 74.0 18
4 10 73.0 4.0 82.0 21 25 66 84 97.0 57
5 69 52.0 82.0 58.0 98 42 56 54 6.0 11
6 50 17.0 32.0 27.0 22 11 0 84 3.0 9
7 70 40.0 75.0 80.0 57 61 85 94 72.0 50
Process finished with exit code 0
(2)将空值进行填充需要用到的:
1、使用fillna(value=,inpace=),value=你要填充的数字
df.fillna(value=666,inplace=True)
将对所有的空值都进行填充,替换为666
输出打印就会是:
0 27 82.0 5.0 3.0 84 11 79 40 4.0 48
1 10 72.0 14.0 27.0 34 68 33 30 3.0 64
2 16 29.0 666.0 11.0 23 87 93 47 97.0 54
3 97 59.0 31.0 666.0 92 96 54 84 29.0 28
4 11 52.0 85.0 86.0 63 75 62 0 91.0 99
5 55 80.0 29.0 62.0 20 99 27 2 40.0 51
6 99 57.0 82.0 22.0 93 49 54 40 80.0 65
7 58 98.0 55.0 66.0 90 33 82 17 20.0 93
8 29 70.0 72.0 32.0 37 22 30 68 666.0 57
9 8 666.0 30.0 18.0 74 9 58 17 98.0 73
Process finished with exit code 0
不推荐使用
第二种:使用近邻值进行填充
df.fillna(method = ,anxis=)
method = ‘ffill’,表示向前填充,method = 'bfill’表示向后填充
案例:
对给定的excel表格的数据进行一下三种操作
1、检测一下该表格有哪些列有空值
2、检测一下该表格每一列的空值数
3、将该空值所在列的平均值替换到该列的空值
# 需要完成的任务:
# 1、检测df中那些列存有空值
# 2、检测df中存有空值的个数
# 3、使用空值对应列的均值进行空值填充
import pandas as pd
from pandas import DataFrame, Series
df = pd.read_excel('C:/Users/lenovo/Desktop/testData.xlsx',date_parser=False)
df.drop(labels=['none', 'none1'], axis=1, inplace=True)
df['time'] = pd.to_datetime(df['time'])
df.set_index(df['time'], inplace=True)
df.drop(labels='time', inplace=True, axis=1)
print(df.head())
# 1、检测df中有哪些列存在空值
print(df.isnull().any().index)
# 2、检测df中有空值的个数
print(df.isnull().sum(axis=0)) # axis=0表示统计的是每一列包含none的数量
#null_num = df.isnull().sum(axis=0) # 先进行isnull函数对不是null的赋值none,对是的赋值true,然后使用sum进行行统计,axis=0表示的列统计
# 3、使用空值对应列的平均值对空值进行填充
for col in df.columns:
if df[col].isnull().sum != 0:
value = df[col].mean()
df[col].fillna(value=value,axis=0,inplace=True)
print(df)
实验结果:
1 2 3 4 5 6 7
time
2019-01-27 17:00:00 -24.8 -18.2 -20.8 -18.8 NaN NaN NaN
2019-01-27 17:01:00 -23.5 -18.8 -20.5 -19.8 -15.2 -14.5 -16.0
2019-01-27 17:02:00 -23.2 -19.2 NaN NaN -13.0 NaN -14.0
2019-01-27 17:03:00 -22.8 -19.2 -20.0 -20.5 NaN -12.2 -9.8
2019-01-27 17:04:00 -23.2 -18.5 -20.0 -18.8 -10.2 -10.8 -8.8
Index([1, 2, 3, 4, 5, 6, 7], dtype='object')
1 58
2 33
3 25
4 13
5 41
6 54
7 23
dtype: int64
1 2 3 ... 5 6 7
time ...
2019-01-27 17:00:00 -24.8 -18.2 -20.800000 ... 0.944848 1.419881 -0.714947
2019-01-27 17:01:00 -23.5 -18.8 -20.500000 ... -15.200000 -14.500000 -16.000000
2019-01-27 17:02:00 -23.2 -19.2 -29.183961 ... -13.000000 1.419881 -14.000000
2019-01-27 17:03:00 -22.8 -19.2 -20.000000 ... 0.944848 -12.200000 -9.800000
2019-01-27 17:04:00 -23.2 -18.5 -20.000000 ... -10.200000 -10.800000 -8.800000
... ... ... ... ... ... ... ...
2019-01-28 10:35:00 -26.2 -27.2 -28.800000 ... -2.000000 1.419881 -5.000000
2019-01-28 10:36:00 -26.8 -27.5 -29.000000 ... -2.200000 1.419881 -5.000000
2019-01-28 10:37:00 -27.2 -27.8 -29.000000 ... -2.200000 1.419881 -5.000000
2019-01-28 10:38:00 -27.5 -27.0 -29.000000 ... -3.500000 -3.200000 -5.800000
2019-01-28 10:39:00 -27.0 -27.2 -29.000000 ... -5.000000 1.419881 -7.000000
[1060 rows x 7 columns]
Process finished with exit code 0
二处理重复数据:
当遇到重复数据时,需要找到重复数据的行或者列
使用df.duplicated()函数,得到重复的列,括号里面可以进行参数设计,
df_same = df.duplicated(keep='first')#表示将第一列看成没有重复,后面的列都是重复列,将得到的结果返给df_same
df_same = df.duplicated(keep='last')#表示将最后一列看成没有重复
三根据自定义的标准处理
例如,自定义一个1000行3列(A,B,C)取值范围为0-1的数据源,将C列中的值大于其两倍标准差的异常值进行清洗
# 自定义一个1000行3列(A,B,C)取值范围为0-1的数据源,然后将c列中的值大于其两倍标准差的异常值进行清洗
# 分为四步走:1、导入需要的工具包;2、定义数组;3、算数c列的标准差;4、找出异常值并处理异常值
# 第一步
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
# 第二步
df = DataFrame(data=np.random.random(size=(1000, 3)), columns=['A', 'B', 'C'])
print(df)
print(df.head())
# 第三步
df_std = df['C'].std()*2
print(df_std)
data = (df['C']>df_std)
print(data)
df1 = df.loc[data]
print(df1)
df.drop(labels=df1.index,inplace=True,axis=0)
print(df)
结果是:
A B C
0 0.378151 0.939901 0.584863
1 0.869707 0.272352 0.353541
2 0.464077 0.320481 0.164022
3 0.901391 0.573913 0.179325
4 0.112288 0.948179 0.700864
.. ... ... ...
995 0.391117 0.129305 0.322319
996 0.411030 0.530228 0.998344
997 0.477963 0.832078 0.044218
998 0.913477 0.682305 0.280610
999 0.155246 0.737106 0.133518
[1000 rows x 3 columns]
A B C
0 0.378151 0.939901 0.584863
1 0.869707 0.272352 0.353541
2 0.464077 0.320481 0.164022
3 0.901391 0.573913 0.179325
4 0.112288 0.948179 0.700864
0.5733756405676743
0 True
1 False
2 False
3 False
4 True
...
995 False
996 True
997 False
998 False
999 False
Name: C, Length: 1000, dtype: bool
A B C
0 0.378151 0.939901 0.584863
4 0.112288 0.948179 0.700864
8 0.721080 0.127963 0.619648
10 0.921231 0.133528 0.580299
12 0.514501 0.944826 0.784537
.. ... ... ...
986 0.157430 0.105866 0.887062
988 0.841011 0.116333 0.868427
990 0.765185 0.878632 0.887489
992 0.155235 0.815150 0.923060
996 0.411030 0.530228 0.998344
[383 rows x 3 columns]
A B C
1 0.869707 0.272352 0.353541
2 0.464077 0.320481 0.164022
3 0.901391 0.573913 0.179325
5 0.061084 0.167466 0.349835
6 0.901757 0.341740 0.134388
.. ... ... ...
994 0.329383 0.156092 0.337116
995 0.391117 0.129305 0.322319
997 0.477963 0.832078 0.044218
998 0.913477 0.682305 0.280610
999 0.155246 0.737106 0.133518
[617 rows x 3 columns]
Process finished with exit code 0
也可以用第二种办法直接选出
df1 = df.loc[~data]
print(df1)