Python 如何测试nan';在熊猫中的应用函数中是什么?

Python 如何测试nan';在熊猫中的应用函数中是什么?,python,pandas,dataframe,nan,Python,Pandas,Dataframe,Nan,我在一些列上执行了一个简单的apply函数。但是,它总是被pandas中的NaN值绊倒 input_data = np.array( [ [random.randint(0,9) for x in range(2)]+['']+['g'], [random.randint(0,9) for x in range(3)]+['g'], [random.randint(0,9) for x in range(3)]+['a'], [random.randint(0,9) for x in range

我在一些列上执行了一个简单的
apply
函数。但是,它总是被
pandas
中的
NaN
值绊倒

input_data = np.array(
[
[random.randint(0,9) for x in range(2)]+['']+['g'],
[random.randint(0,9) for x in range(3)]+['g'],
[random.randint(0,9) for x in range(3)]+['a'],
[random.randint(0,9) for x in range(3)]+['b'],
[random.randint(0,9) for x in range(3)]+['b']
]
)

input_df = pd.DataFrame(data=input_data, columns=['B', 'C', 'D', 'label'])
我有一个简单的lambda,如下所示:

input_df['D'].apply(lambda aCode: re.sub('\.', '', aCode) if not np.isnan(aCode) else aCode)
它会被NaN值绊倒:

File "<pyshell#460>", line 1, in <lambda>
    input_df['D'].apply(lambda aCode: re.sub('\.', '', aCode) if not np.isnan(aCode) else aCode)
TypeError: Not implemented for this type
两者都会得到相同的错误


除了
np.isnan
之外,我不知道如何测试nan值。有没有更简单的方法?谢谢。

您的代码失败,因为您的第一个条目是空字符串,
np.isnan
不理解空字符串:

In [55]:
input_df['D'].iloc[0]

Out[55]:
''

In [56]:
np.isnan('')

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-a9f139a0c5b8> in <module>()
----> 1 np.isnan('')

TypeError: Not implemented for this type
但是,如果您只是想替换某些内容,则只需使用
.str.replace

In [58]:
input_df['D'].str.replace('\.','')

Out[58]:
0     
1    3
2    3
3    0
4    3
Name: D, dtype: object

input\u df['D'].apply(lambda aCode:re.sub('\.','',aCode)如果pd.notnull(aCode)或者aCode)起作用,但是你想做什么呢?例如,这做同样的事情:
input\u df['D'].str.replace('\.','')
你可以使用
math.isnan()
测试nan值。
pd.notnull
起作用。但是我是唯一一个对
np.isnan
不起作用感到惊讶的人吗?我以为pandas nulls是基于
np-nans
np构建的。isnan
不理解空字符串,这就是为什么,谢谢。我发现字符串替换更简单、更优雅,但我正在努力更好地理解
NaNs
。如何人工创建
NaN
?我认为
np.nan
是实现这一点的方法,但pandas并不总是将其转换为数据帧/系列中的
nan
。它也不会将
'
转换为
NaN
值。如何在pandas中创建
NaN
值?嗯
NaN
是浮点类型,字符串中没有等效项,您可以在str列中使用
NaN
,这将使该列成为混合数据类型。您必须确定字符串中缺失值的构成,空字符串可以,但np识别空字符串的方式与识别
NaN
值的方式不同。因此,我认为在
object
类型的列中确实无法表示
NaN
?因此,如果我有一列字符串,其中一些是NaN,那么在使用
pd.DataFrame.dropna()
删除
NaN
s之前,我必须将列值转换为浮点值?这似乎有点麻烦……您可以使用字符串和float
NaN
,列类型将是
object
,但它实际上是混合数据类型,在这种情况下
dropna
将起作用,但如果方法期望all
str
或all
float
,则会导致某些操作失败,实际上,您应该决定什么是缺少的值,这样空字符串就可以了,在这种情况下,您可以使用
df['col']=''
In [57]:
import re
input_df['D'].apply(lambda aCode: re.sub('\.', '', aCode) if pd.notnull(aCode) else aCode)

Out[57]:
0     
1    3
2    3
3    0
4    3
Name: D, dtype: object
In [58]:
input_df['D'].str.replace('\.','')

Out[58]:
0     
1    3
2    3
3    0
4    3
Name: D, dtype: object