我有一个简单的apply
函数,我在一些列上执行。但是,NaN
中pandas
值会导致它绊倒。
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
所以,我试着测试Pandas补充的纳米值:
np.isnan(input_df['D'].values[0])
np.isnan(input_df['D'].iloc[0])
两者都有同样的错误。
我不知道如何测试np.isnan
以外的nan值。有更简单的方法吗?感谢。
答案 0 :(得分:6)
您的代码失败,因为您的第一个条目是空字符串而且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
ps.notnull
确实有效:
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
但是,如果您只想更换某些内容,请使用.str.replace
:
In [58]:
input_df['D'].str.replace('\.','')
Out[58]:
0
1 3
2 3
3 0
4 3
Name: D, dtype: object