python学习之pandas数据清洗

数据清洗:因为数据中出现了异常值,需要将异常值剔除

一 处理丢失数据:

两种丢失数据:
		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)
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值