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之前,我必须将列值转换为浮点值?这似乎有点麻烦……您可以使用字符串和floatNaN
,列类型将是object
,但它实际上是混合数据类型,在这种情况下dropna
将起作用,但如果方法期望allstr
或allfloat
,则会导致某些操作失败,实际上,您应该决定什么是缺少的值,这样空字符串就可以了,在这种情况下,您可以使用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