分享

python小技能-缺失数据处理

 生物_医药_科研 2019-01-12
停更了几周的python基础学习,今天我们跟上,接下来几周将重点学习如何处理缺失数据、重复数据、字符串操作和其它分析数据转换的工具

缺失数据

缺失数据在pandas中呈现的方式有些不完美,但对于大多数用户可以保证功能正常。对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。在python中其为哨兵值,可以方便的检测出来:

导入神库

import pandas as pd

import numpy as np

    string_data=pd.Series(['aardvark''artichoke', np.nan, 'avocado'])

## 判断是否为缺失值
string_data.isnull()
0    False
1    False
2     True
3    False  

第二种方法 判断

pd.isna(string_data)

0    False
1    False
2     True
3    False
dtype: bool

在pandas中,采用了R语言中的惯用法,即将缺失值表示为NA,它表示不可用not available 。在统计应用中,NA数据可能是不存在的数据或者虽然存在,但是没有观察到(例如,数据采集中发生了问题)。当进行数据清洗以进行分析时,最好直接对缺失数据进行分析,以判断数据采集的问题或缺失数据可能导致的偏差。

Python内置的None值在对象数组中也可以作为NA:

string_data[0]==None  ##判断
False
string_data[0]=None  ## 赋值
string_data
0         None
1    artichoke
2          NaN
3      avocado
dtype: object
pd.isnull(string_data)
0     True
1    False
2     True
3    False
dtype: bool

滤除缺失数据

过滤掉缺失数据的办法有很多种。你可以通过pandas.isnull 或布尔索引的手工方法,但dropna可能会更实用一些。对于一个Series ,dropna返回一个仅含非空数据和索引值的Series :
from numpy import nan as NA
data=pd.Series([1,NA,3,NA,7])
data.dropna()
0    1.0
2    3.0
4    7.0
dtype: float64
#这等价于:
data[data.notna()]
0    1.0
2    3.0
4    7.0
dtype: float64

而对于DataFrame对象,事情就有点复杂了。你可能希望丢弃全NA或含有

NA的行或列。dropna默认丢弃任何含有缺失值的行:

data = pd.DataFrame([[1.6.53.], [1.NANA],
                    [NANANA], [NA6.53.]])
data

012
01.06.53.0
11.0NaNNaN
2NaNNaNNaN
3NaN6.53.0
clean_data=data.dropna()

clean_data

012
01.06.53.0
### 可以看出,默认删除的是含有NA值的行

#
#传入how='all' 将只丢弃全为NA的那些行:

data.dropna(how='all')

012
01.06.53.0
11.0NaNNaN
3NaN6.53.0
# 如果按照列删除缺失值,只需传入axis=1 即可:

data.dropna(how='all',axis=1)

012
01.06.53.0
11.0NaNNaN
2NaNNaNNaN
3NaN6.53.0

另一个滤除DataFrame行的问题涉及时间序列数据。假设你只想留下一部分

观测数据,可以用thresh 参数实现此目的:

df=pd.DataFrame(np.random.randn(7,3))

df

012
0-0.4750240.8088770.846899
11.985728-0.498647-0.461880
2-0.121965-0.6471251.897084
30.408052-0.4912820.398916
4-0.2725061.000522-0.114962
5-0.1717800.501524-0.362652
6-1.3767140.138974-0.152652
df.iloc[:4,1]=NA

df.iloc[:2,2]



0    0.846899
1   -0.461880
Name: 2, dtype: float64




df.iloc[:2,2]=NA

df

012
0-0.475024NaNNaN
11.985728NaNNaN
2-0.121965NaN1.897084
30.408052NaN0.398916
4-0.2725061.000522-0.114962
5-0.1717800.501524-0.362652
6-1.3767140.138974-0.152652
df.dropna()

012
4-0.2725061.000522-0.114962
5-0.1717800.501524-0.362652
6-1.3767140.138974-0.152652
df.dropna(axis=1)

0
0-0.475024
11.985728
2-0.121965
30.408052
4-0.272506
5-0.171780
6-1.376714
 df.dropna(thresh=3) ###thresh 代表的是删除索引从0开始到索引为thresh为止

012
4-0.2725061.000522-0.114962
5-0.1717800.501524-0.362652
6-1.3767140.138974-0.152652

填充缺失数据

你可能不想滤除缺失数据(有可能会丢弃跟它有关的其他数据),而是希望通过其他方式填补那些“空洞”。对于大多数情况而言,fillna方法是最主要的函数。通过一个常数调用fillna就会将缺失值替换为那个常数值:
### 比如用0填充
df.fillna(0)

012
0-0.4750240.0000000.000000
11.9857280.0000000.000000
2-0.1219650.0000001.897084
30.4080520.0000000.398916
4-0.2725061.000522-0.114962
5-0.1717800.501524-0.362652
6-1.3767140.138974-0.152652
#若是通过一个字典调用fillna,就可以实现对不同的列填充不同的值:
df.fillna({1:1,2:2})

012
0-0.4750241.0000002.000000
11.9857281.0000002.000000
2-0.1219651.0000001.897084
30.4080521.0000000.398916
4-0.2725061.000522-0.114962
5-0.1717800.501524-0.362652
6-1.3767140.138974-0.152652

对reindexing 有效的那些插值方法也可用于fillna:

df=pd.DataFrame(np.random.randn(6,3))
df.iloc[:2,1]
0    0.341521
1   -0.236488
Name: 1, dtype: float64
df.iloc[2:,1]=NA
df

012
0-1.3084690.3415210.665815
1-0.343031-0.2364883.169433
21.651689NaN0.398313
3-0.601294NaN-0.284620
41.516970NaN1.344071
5-2.583564NaN0.508698
df.iloc[3:,2]=NA
df

012
0-1.3084690.3415210.665815
1-0.343031-0.2364883.169433
21.651689NaN0.398313
3-0.601294NaNNaN
41.516970NaNNaN
5-2.583564NaNNaN
df.fillna(method='ffill')

012
0-1.3084690.3415210.665815
1-0.343031-0.2364883.169433
21.651689-0.2364880.398313
3-0.601294-0.2364880.398313
41.516970-0.2364880.398313
5-2.583564-0.2364880.398313
df.fillna(method='ffill'limit=2) ##表示之填充两个

012
0-1.3084690.3415210.665815
1-0.343031-0.2364883.169433
21.651689-0.2364880.398313
3-0.601294-0.2364880.398313
41.516970NaN0.398313
5-2.583564NaNNaN
df.fillna(df[0].mean()) ## 用第一列均值填充

012
0-1.3084690.3415210.665815
1-0.343031-0.2364883.169433
21.651689-0.2779500.398313
3-0.601294-0.277950-0.277950
41.516970-0.277950-0.277950
5-2.583564-0.277950-0.277950
df[0]
0   -1.308469
1   -0.343031
2    1.651689
3   -0.601294
4    1.516970
5   -2.583564
Name: 0, dtypefloat64


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多