1. 解决问题:

在pandas中处理并删除指定G中为空值的行。

python 检测删除空列表 python删除为空值的行_python

2. 解决尝试:

删除所有为NaN的值,如果拿出第0行,第二列数据,与第1行第二列数据,得到如下:

python 检测删除空列表 python删除为空值的行_API_02

貌似可以做两个数据进行等于的逻辑判断,但是实际上是不可以的,如下所示:他们返回的值是False, 但是实际上,两个值为空,应该相等的。

python 检测删除空列表 python删除为空值的行_删除元素_03

如果我们使用如下的变量进行验证,这个与使用pandas索引出来处理的结果是不一样的,在此处,我没有找到原因(如果有小伙伴知道的话,请留言告诉我)

python 检测删除空列表 python删除为空值的行_删除元素_04

所以我们不能使用空值来判断,经过调研,了解到,有np.isnan()函数可以调用,进行如下操作,我们可以通过调用API的方式来进行判断该值是否空值。

python 检测删除空列表 python删除为空值的行_数据_05

所以,我们想到使用判断该值是否为空,来进行删除空值的所在的行。

def data_dropnan(data):
    for i in data.index:
        if np.isnan(data.iloc[i][1]):
            data = data.drop([i])
    return data

但是运行以后会报错:

IndexError: single positional indexer is out-of-bounds

这个问题我还没有解决,我不知道怎么解决这个问题,如果有小伙伴知道,请私信我。我的理解是,在 i 循环到最后一个数时,判断下标越界了。

修改以后函数如下:

def data_dropnan(data):
    for i in data.index:
        if i < data.shape[0]:
            if np.isnan(data.iloc[i][1]):
                print(i)
                data = data.drop(i)
    return data

输出仍然不满足,并没有删除我认为的空值:

python 检测删除空列表 python删除为空值的行_python_06

不知道为什么会这样,待后续研究。

 

尝试使用现成API,了解到有np.dropna()函数,使用效果如下:

python 检测删除空列表 python删除为空值的行_删除元素_07

修改threshold,得到:

python 检测删除空列表 python删除为空值的行_API_08

再次修改参数,得到如下,如果要删除空值的话,需要配置subset参数,该参数指定特定列,而axis=0,表示删除特定行。

python 检测删除空列表 python删除为空值的行_python 检测删除空列表_09

以上的操作方式均高效,也不具有灵活性,经过google,百度搜索得到某函数:该函数表示删除数据data中,D列,所有为None的行,同理,更换None,可以删除特定值的行。

data2 = data[~data.D.isin([None])]

python 检测删除空列表 python删除为空值的行_API_10

 

3.结论

使用data[~data.D.isin([?])]的方式删除指定数据的行,pandas中的drop函数适合删除整行整列,在本文中没有找到为什么drop()无法实现删除元素的原因。