Deal with lost data

  有两种丢失数据:
  
  - None
  - np.nan(NaN)

1. None

None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。

#查看None的数据类型
type(None)  # NoneType

2. np.nan (NAN)

np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。

#查看np.nan的数据类型
type(np.nan)    # float

np.nan + 1  # nan
# 一个空加值还是空

3. pandas in None and NaN

1) pandas中None与np.nan都视作np.nan
创建DataFrame

df = DataFrame(data=np.random.randint(0,100,size=(13,9)))
df
    0   1   2   3   4   5   6   7   8
0   68  34  50  74  5   1   53  33  51
1   8   18  72  73  46  57  94  95  79
2   1   31  19  1   31  83  81  18  94
3   11  98  62  57  3   90  5   16  68
4   62  4   86  34  66  63  24  44  99
5   91  41  27  23  57  65  0   42  14
6   23  54  79  99  86  99  83  64  87
7   96  52  6   54  32  10  72  9   62
8   10  32  27  4   10  77  55  10  60
9   76  91  78  26  2   44  61  20  47
10  71  87  85  3   77  23  98  38  15
11  57  19  34  23  67  46  0   44  39
12  27  5   61  56  71  46  4   50  97



# 将某些数组元素赋值为nan
df.iloc[2,4] = None
df.iloc[5,5] = np.nan
df.iloc[2,2] = None
df.iloc[7,3] = None
df.iloc[6,8] = None

    0   1   2       3       4       5       6   7   8
0   68  34  50.0    74.0    5.0     1.0     53  33  51.0
1   8   18  72.0    73.0    46.0    57.0    94  95  79.0
2   1   31  NaN     1.0     NaN     83.0    81  18  94.0
3   11  98  62.0    57.0    3.0     90.0    5   16  68.0
4   62  4   86.0    34.0    66.0    63.0    24  44  99.0
5   91  41  27.0    23.0    57.0    NaN     0   42  14.0
6   23  54  79.0    99.0    86.0    99.0    83  64  NaN
7   96  52  6.0     NaN     32.0    10.0    72  9   62.0
8   10  32  27.0    4.0     10.0    77.0    55  10  60.0
9   76  91  78.0    26.0    2.0     44.0    61  20  47.0
10  71  87  85.0    3.0     77.0    23.0    98  38  15.0
11  57  19  34.0    23.0    67.0    46.0    0   44  39.0
12  27  5   61.0    56.0    71.0    46.0    4   50  97.0



2) pandas处理空值操作
isnull()
notnull()
dropna(): 过滤丢失数据
fillna(): 填充丢失数据
    
(1)判断函数
isnull()
notnull()


df.isnull()
    0       1       2       3       4       5       6       7     8
0   False   False   False   False   False   False   False   False   False
1   False   False   False   False   False   False   False   False   False
2   False   False   True    False   True    False   False   False   False
3   False   False   False   False   False   False   False   False   False
4   False   False   False   False   False   False   False   False   False
5   False   False   False   False   False   True    False   False   False
6   False   False   False   False   False   False   False   False   True
7   False   False   False   True    False   False   False   False   False
8   False   False   False   False   False   False   False   False   False
9   False   False   False   False   False   False   False   False   False
10  False   False   False   False   False   False   False   False   False
11  False   False   False   False   False   False   False   False   False
12  False   False   False   False   False   False   False   False   False




# df.notnull/isnull().any()/all()
# 过滤df中的空值(只保留没有空值的行)

# 鉴定某些行 或者某些列 有空值
df.isnull().any(axis=1) # axis=1 是行
0     False
1     False
2      True
3     False
4     False
5      True
6      True
7      True
8     False
9     False
10    False
11    False
12    False
dtype: bool



# any  遇到True就返回Ture
# all 取全部,有一个false 就返回false

# notnull  跟 all 
# notnull 返回的是有空的为True 

# isnull  跟 any
# isnull  返回的是有空的为false

df.notnull().all(axis=1)
0      True
1      True
2     False
3      True
4      True
5     False
6     False
7     False
8      True
9      True
10     True
11     True
12     True
dtype: bool


df.loc[df.notnull().all(axis=1)]
    0   1   2       3       4       5       6   7   8
0   68  34  50.0    74.0    5.0     1.0     53  33  51.0
1   8   18  72.0    73.0    46.0    57.0    94  95  79.0
3   11  98  62.0    57.0    3.0     90.0    5   16  68.0
4   62  4   86.0    34.0    66.0    63.0    24  44  99.0
8   10  32  27.0    4.0     10.0    77.0    55  10  60.0
9   76  91  78.0    26.0    2.0     44.0    61  20  47.0
10  71  87  85.0    3.0     77.0    23.0    98  38  15.0
11  57  19  34.0    23.0    67.0    46.0    0   44  39.0
12  27  5   61.0    56.0    71.0    46.0    4   50  97.0

# df.dropna() 可以选择过滤的是行还是列(默认为行):axis中0表示行,1表示的列

# 带dropna系列的函数方法 中axis是相反 的

df.dropna(axis=0)
    0   1   2       3       4       5       6   7   8
0   68  34  50.0    74.0    5.0     1.0     53  33  51.0
1   8   18  72.0    73.0    46.0    57.0    94  95  79.0
3   11  98  62.0    57.0    3.0     90.0    5   16  68.0
4   62  4   86.0    34.0    66.0    63.0    24  44  99.0
8   10  32  27.0    4.0     10.0    77.0    55  10  60.0
9   76  91  78.0    26.0    2.0     44.0    61  20  47.0
10  71  87  85.0    3.0     77.0    23.0    98  38  15.0
11  57  19  34.0    23.0    67.0    46.0    0   44  39.0
12  27  5   61.0    56.0    71.0    46.0    4   50  97.0



(3) 填充函数 Series/DataFrame
# fillna():value和method参数
    
# ffill 向前填充
# bfill   向后填充

df.fillna(method='ffill',axis=0)
   
    
# 数据清洗案例
temp_df = pd.read_excel('测试数据.xlsx')
temp_df = temp_df[[1,2,3,4]]
temp_df.dropna(axis=0)

# 首次填充之后对应的结果
test_df = temp_df.fillna(method='bfill',axis=0)

# 校验test_df中还是否存在空值:查看列中是否还有空值
test_df.isnull().any(axis=0)

1    False
2    False
3    False
4    False
dtype: bool

Guess you like

Origin www.cnblogs.com/Quantum-World/p/11354463.html