首页 > 解决方案 > 检查应用于数据帧的 np.nan 内部函数

问题描述

这是我的代码:

import numpy as np
import pandas as pd

df_i2b2 = pd.DataFrame({'id':[1,2,3,4],
                        'DIAGNOSIS_CODES':["338.29; 353.6; 355.9; 722.6; 724.2; E43",
                               "278.00; 300.00; 305.1; 353.6",
                               "E66.9; F32.9; F41.9; J96.10; S06",
                               np.nan]})


def diag_TBI(my_str):
    if my_str.isna():
        return np.nan
    else:
        return 1



df_i2b2['TBI_var'] = df_i2b2['DIAGNOSIS_CODES'].apply(diag_TBI)
df_i2b2['TBI_var'].value_counts(dropna = False)

输出:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
c:\Arch\Work\Register\a_Code\Snippets\i2b2test_NA_SO_Question.py in 
     18 
     19 
---> 20 df_i2b2['TBI_var'] = df_i2b2['DIAGNOSIS_CODES'].apply(diag_TBI)
     21 df_i2b2['TBI_var'].value_counts(dropna = False)
     22 

~\Anaconda3\envs\lake_reg2\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
   3846             else:
   3847                 values = self.astype(object).values
-> 3848                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3849 
   3850         if len(mapped) and isinstance(mapped[0], Series):

pandas\_libs\lib.pyx in pandas._libs.lib.map_infer()

c:\Arch\Work\Register\a_Code\Snippets\i2b2test_NA_SO_Question.py in diag_TBI(my_str)
     11 
     12 def diag_TBI(my_str):
---> 13     if my_str.isna():
     14         return np.nan
     15     else:

AttributeError: 'str' object has no attribute 'isna'



问题:如何检查np.nan它是否在应用于它的函数内部的数据框中?如何修改if my_str.isna():,使代码工作?

标签: pythonpython-3.xpandas

解决方案


np.where()您可以在不需要apply函数的情况下以矢量化方式轻松解决问题:

df_i2b2['TBI_var'] = np.where(df_i2b2['DIAGNOSIS_CODES'].isna(),np.nan,1)

这将返回:

   id                          DIAGNOSIS_CODES  TBI_var
0   1  338.29; 353.6; 355.9; 722.6; 724.2; E43      1.0
1   2             278.00; 300.00; 305.1; 353.6      1.0
2   3         E66.9; F32.9; F41.9; J96.10; S06      1.0
3   4                                      NaN      NaN

推荐阅读