使用pandas时无法过滤NaN值

时间:2017-08-22 12:38:00

标签: python pandas

此代码:

import re
class_size=data["class_size"]
def is_912(string):
    if pd.isnull(string)==True:
        return False
    if re.search('09-12',string) is not None:
          return True
    else:
          return False

is_9or12=class_size['GRADE '].apply(is_912)
class_size['GRADE ']=class_size['GRADE '][is_9or12==True]
print(class_size['GRADE '])

给出以下结果:

0          NaN
1          NaN
2          NaN
3          NaN
4          NaN
5          NaN
6          NaN
...
27605    09-12
27606    09-12
27607    09-12
27608    09-12
27609    09-12

我无法理解为什么我的功能不会滤除NaN值?

3 个答案:

答案 0 :(得分:1)

停止使用apply()。它违背了Pandas的目的,这是有效的矢量化计算。它重新引入了Python循环和缓慢的执行,并且98%的时间都没有必要使用它。

尝试这样的事情:

class_size = data["class_size"]
is_9or12 = class_size['GRADE '].isin(('09', '10', '11', '12'))

从您的问题中不清楚您的数据是什么样的,但是这里有一些特定于字符串的方法在Pandas中运行并且很快:

https://pandas.pydata.org/pandas-docs/stable/text.html

答案 1 :(得分:0)

如果你想删除nans,你可以使用dropna方法,看看这个例子:

df = pd.DataFrame(np.nan, index=np.arange(5), columns=['A'])

without_nan = df.dropna(subset = ['A'])

在某些情况下,最好使用:

df[np.isfinite(df['A'])]

答案 2 :(得分:0)

这是因为您只是替换了GRADE向量中相应值为class_size的列True的值。听起来你可能没有从根本上理解你所建的东西,我会试着解释原因:

is_9or12=class_size['GRADE '].apply(is_912)

这行代码创建了一个TrueFalse值的新向量(数组),其长度与DataFrame的GRADE列相同。由于我们无法看到您的数据集,我现在假设is_912函数中的逻辑按预期工作。

class_size['GRADE ']=class_size['GRADE '][is_9or12==True]

对于GRADE向量具有is_9or12值的索引,此行代码会将True列中的值替换为自身(?)。

由于您没有做任何更改或删除列中NaN值的操作,因此在执行这些代码行之前,它们仍然保持原样。

同样,如果没有可重复的例子,这只是猜测,但我认为这是你要求的。