首页 > 其他分享 >基于pandas的数据清洗

基于pandas的数据清洗

时间:2022-11-26 16:00:59浏览次数:36  
标签:... 基于 Code False df 清洗 True pandas View

基于pandas的数据清洗

以下三种数据需要清洗:

  • 原数据中会存在缺失值(空值)

  • 重复值

  • 异常值

处理丢失数据(空值)

  • 有两种丢失数据:

    • None

    • np.nan(NaN)

  • 两种丢失数据的区别

import pandas as pd
from pandas import DataFrame
import numpy as np

 

type(None) # None对象类型
NoneType
type(np.nan) # nan浮点类型
float
  • 为什么在数据分析中需要用到的是浮点类型的空而 不是对象类型?

    • 数据分析中会常常使用某些形式的运算来处理原始数据,如果原数数据中的空值为NAN的形式,则不会干扰或者中断运算。

    • NAN可以参与运算的

    • None是不可以参与运算

np.nan + 1
nan
None + 1 # 报错类型不同
  • 在pandas中如果遇到了None形式的空值则pandas会将其强转成NAN的形式。

df = DataFrame(data=np.random.randint(0,100,size=(7,5)))
df.iloc[2,3] = None # 第二行第三列赋值成None
df.iloc[4,2] = np.nan
df.iloc[5,4] = None
df # 全是Nan的形式存储的
     0   1     2    3       4
0   23  67  72.0    72.0    78.0
1   37  26  28.0    44.0    19.0
2   0   69  90.0    NaN 28.0
3   76  67  15.0    15.0    50.0
4   54  52  NaN 69.0    53.0
5   38  85  0.0 80.0    NaN
6   86  98  88.0    70.0    84.0
View Code

pandas处理空值操作

  • isnull

  • notnull

  • any

  • all

  • dropna

  • fillna

方式1:对空值进行过滤(删除空所在的行数据)

  • 技术:isnull,notnull,any,all

df.isnull() # 是空值返回true
        0      1       2        3       4
0   False   False   False   False   False
1   False   False   False   False   False
2   False   False   False   True    False
3   False   False   False   False   False
4   False   False   True    False   False
5   False   False   False   False   True
6   False   False   False   False   False
View Code
 
#哪些行中有空值
#any(axis=1)检测哪些行中存有空值
df.isnull().any(axis=1) #any会作用isnull返回结果的每一行
#true对应的行就是存有缺失数据的行
0    False
1    False
2     True
3    False
4     True
5     True
6    False
dtype: bool
View Code

 

df.notnull()
       0       1       2       3    4
0   True    True    True    True    True
1   True    True    True    True    True
2   True    True    True    False   True
3   True    True    True    True    True
4   True    True    False   True    True
5   True    True    True    True    False
6   True    True    True    True    True
View Code

 

df.notnull().all(axis=1)
0     True
1     True
2    False
3     True
4    False
5    False
6     True
dtype: bool
View Code
#将布尔值作为源数据的行索引
df.loc[df.notnull().all(axis=1)]
     0   1     2       3    4
0   23  67  72.0    72.0    78.0
1   37  26  28.0    44.0    19.0
3   76  67  15.0    15.0    50.0
6   86  98  88.0    70.0    84.0
View Code
#获取空对应的行数据
df.loc[df.isnull().any(axis=1)]
#获取空对应行数据的行索引
indexs = df.loc[df.isnull().any(axis=1)].index
indexs
Int64Index([2, 4, 5], dtype='int64')
View Code
df.drop(labels=indexs,axis=0) # 删掉空行数据
 
     0   1     2       3       4
0   23  67  72.0    72.0    78.0
1   37  26  28.0    44.0    19.0
3   76  67  15.0    15.0    50.0
6   86  98  88.0    70.0    84.0
View Code

 

规律: 
isnull-》any
notnull-》all

方式2:dropna:可以直接将缺失的行或者列进行删除

df.dropna(axis=0)
     0  1   2       3       4
0   23  67  72.0    72.0    78.0
1   37  26  28.0    44.0    19.0
3   76  67  15.0    15.0    50.0
6   86  98  88.0    70.0    84.0
View Code
  • 对缺失值(空值)进行覆盖

    • fillna

df.fillna(value=999) #使用指定值将源数据中所有的空值进行填充
    0    1     2       3    4
0   23  67  72.0    72.0    78.0
1   37  26  28.0    44.0    19.0
2   0   69  90.0    999.0   28.0
3   76  67  15.0    15.0    50.0
4   54  52  999.0   69.0    53.0
5   38  85  0.0 80.0    999.0
6   86  98  88.0    70.0    84.0
View Code
#使用空的近邻值进行填充
#method=ffill向前填充,bfill向后填充
df.fillna(axis=0,method='bfill')
    0   1     2       3     4
0   23  67  72.0    72.0    78.0
1   37  26  28.0    44.0    19.0
2   0   69  90.0    15.0    28.0
3   76  67  15.0    15.0    50.0
4   54  52  0.0 69.0    53.0
5   38  85  0.0 80.0    84.0
6   86  98  88.0    70.0    84.0
View Code

 

  • 什么时候用dropna什么时候用fillna

    • 尽量使用dropna,如果删除成本比较高,则使用fillna

    • 使用空值对应列的均值进行空值填充

for col in df.columns:
    #检测哪些列中存有空值
    if df[col].isnull().sum() > 0:#说明df[col]中存有空值
        mean_value = df[col].mean()
        df[col] = df[col].fillna(value=mean_value)

 

面试题

  • 数据说明:

    • 数据是1个冷库的温度数据,1-7对应7个温度采集设备,1分钟采集一次。

  • 数据处理目标:

    • 用1-4对应的4个必须设备,通过建立冷库的温度场关系模型,预估出5-7对应的数据。

    • 最后每个冷库中仅需放置4个设备,取代放置7个设备。

    • f(1-4) --> y(5-7)

  • 数据处理过程:

    • 1、原始数据中有丢帧现象,需要做预处理;

    • 2、matplotlib 绘图;

    • 3、建立逻辑回归模型。

  • 无标准答案,按个人理解操作即可,请把自己的操作过程以文字形式简单描述一下,谢谢配合。

  • 测试数据为testData.xlsx

df = pd.read_excel('../data/testData.xlsx') # 取数据
df = df[[1,2,3,4]]
df
       1       2       3    4
0   -24.8   -18.2   -20.8   -18.8
1   -23.5   -18.8   -20.5   -19.8
2   -23.2   -19.2   NaN NaN
3   -22.8   -19.2   -20.0   -20.5
4   -23.2   -18.5   -20.0   -18.8
... ... ... ... ...
1055    -26.2   -27.2   -28.8   -27.5
1056    -26.8   -27.5   -29.0   -27.8
1057    -27.2   -27.8   -29.0   -28.0
1058    -27.5   -27.0   -29.0   -28.0
1059    -27.0   -27.2   -29.0   -27.8
1060 rows × 4 columns
View Code
data = pd.read_excel('../data/testData.xlsx').drop(labels=['none','none1'],axis=1) # 删掉空列
data
    time                   1       2       3       4     5  6   7
0   2019-01-27 17:00:00 -24.8   -18.2   -20.8   -18.8   NaN NaN NaN
1   2019-01-27 17:01:00 -23.5   -18.8   -20.5   -19.8   -15.2   -14.5   -16.0
2   2019-01-27 17:02:00 -23.2   -19.2   NaN NaN -13.0   NaN -14.0
3   2019-01-27 17:03:00 -22.8   -19.2   -20.0   -20.5   NaN -12.2   -9.8
4   2019-01-27 17:04:00 -23.2   -18.5   -20.0   -18.8   -10.2   -10.8   -8.8
... ... ... ... ... ... ... ... ...
1055    2019-01-28 10:35:00 -26.2   -27.2   -28.8   -27.5   -2.0    NaN -5.0
1056    2019-01-28 10:36:00 -26.8   -27.5   -29.0   -27.8   -2.2    NaN -5.0
1057    2019-01-28 10:37:00 -27.2   -27.8   -29.0   -28.0   -2.2    NaN -5.0
1058    2019-01-28 10:38:00 -27.5   -27.0   -29.0   -28.0   -3.5    -3.2    -5.8
1059    2019-01-28 10:39:00 -27.0   -27.2   -29.0   -27.8   -5.0    NaN -7.0
1060 rows × 8 columns
View Code
data.shape
(1060, 8)
#删除空对应的行数据
data.dropna(axis=0).shape
(1060, 8)
#填充(向前填充一次 向后填充一次)
data = data.fillna(method='ffill',axis=0).fillna(method='bfill',axis=0)
data.isnull().any(axis=0) # 检验是否有空列
time    False
1       False
2       False
3       False
4       False
5       False
6       False
7       False
dtype: bool
View Code

 

处理重复数据

# 生成一组重复的行数据源
df = DataFrame(data=np.random.randint(0,100,size=(8,6)))
df.iloc[1] = [1,1,1,1,1,1]
df.iloc[3] = [1,1,1,1,1,1]
df.iloc[5] = [1,1,1,1,1,1]
df
 
    0    1   2   3   4   5
0   4   49  25  90  86  89
1   1   1   1   1   1   1
2   97  76  47  55  42  33
3   1   1   1   1   1   1
4   31  2   47  21  66  39
5   1   1   1   1   1   1
6   63  91  5   87  96  45
7   10  86  37  15  98  59
View Code
#检测哪些行存有重复的数据
df.duplicated(keep='first')
0    False
1    False
2    False
3     True
4    False
5     True
6    False
7    False
dtype: bool
View Code
df.loc[~df.duplicated(keep='first')]
​
    0   1   2   3   4   5
0   4   49  25  90  86  89
1   1   1   1   1   1   1
2   97  76  47  55  42  33
4   31  2   47  21  66  39
6   63  91  5   87  96  45
7   10  86  37  15  98  59
View Code
#异步到位删除(keep='first' 只保留第一次出现的数据)
df.drop_duplicates(keep='first')
    0   1   2   3   4   5
0   4   49  25  90  86  89
1   1   1   1   1   1   1
2   97  76  47  55  42  33
4   31  2   47  21  66  39
6   63  91  5   87  96  45
7   10  86  37  15  98  59
View Code

 

处理异常数据

  • 自定义一个1000行3列(A,B,C)取值范围为0-1的数据源,然后将C列中的值大于其两倍标准差的异常值进行清洗

df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])
df.head()
           A           B           C
0   0.314965    0.515457    0.600996
1   0.328933    0.464051    0.461720
2   0.585531    0.759235    0.203830
3   0.892906    0.967630    0.652470
4   0.505108    0.746608    0.986604
View Code
#制定判定异常值的条件
twice_std = df['C'].std() * 2
twice_std

0.5708372044114679

(df['C']>twice_std)
-(df['C']>twice_std)
df.loc[~(df['C'] > twice_std)]
​
           A           B           C
1   0.328933    0.464051    0.461720
2   0.585531    0.759235    0.203830
5   0.240026    0.271162    0.327709
7   0.905129    0.871658    0.054711
11  0.696862    0.151504    0.408769
... ... ... ...
988 0.710114    0.237056    0.237625
991 0.567679    0.048587    0.454971
992 0.294792    0.283275    0.093556
997 0.926804    0.013606    0.259988
999 0.781145    0.042947    0.460554
577 rows × 3 columns
 
View Code

 

标签:...,基于,Code,False,df,清洗,True,pandas,View
From: https://www.cnblogs.com/erhuoyuan/p/16927584.html

相关文章