此代码:
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值?
答案 0 :(得分:1)
停止使用apply()
。它违背了Pandas的目的,这是有效的矢量化计算。它重新引入了Python循环和缓慢的执行,并且98%的时间都没有必要使用它。
尝试这样的事情:
class_size = data["class_size"]
is_9or12 = class_size['GRADE '].isin(('09', '10', '11', '12'))
从您的问题中不清楚您的数据是什么样的,但是这里有一些特定于字符串的方法在Pandas中运行并且很快:
答案 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)
这行代码创建了一个True
或False
值的新向量(数组),其长度与DataFrame的GRADE
列相同。由于我们无法看到您的数据集,我现在假设is_912
函数中的逻辑按预期工作。
class_size['GRADE ']=class_size['GRADE '][is_9or12==True]
对于GRADE
向量具有is_9or12
值的索引,此行代码会将True
列中的值替换为自身(?)。
由于您没有做任何更改或删除列中NaN
值的操作,因此在执行这些代码行之前,它们仍然保持原样。
同样,如果没有可重复的例子,这只是猜测,但我认为这是你要求的。