如何处理错误:数字浮点数64不可编辑和键错误:Dict中的nan?

2024-09-29 22:27:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图创建一个新的字典dDrugs,方法是从data字典中提取一个drugs的列表(带有一堆字符串值),以及与提取的药物相关联的键(不管有多少个键与一个值具有相同的药物)。我的目标是使用dDrugs字典中的值在现有的pandas dataframedFrame中创建一个新列,使用键来定位和填充dataframe中的适当记录。到目前为止,我得到的是:

data{
 530.0: 'AC FOLLOWED BY Tylenol',
 651.0: nan,
 692.0: nan,
 993.0: 'Penicillin 250mg',
 044.0: nan,
 055.0: 'septrim GIVEN 2x daily.',
 476.0: nan,
 817.0: 'penicilin 100MG & ibuprofen 1160MG',
 748.0: 'ADVIL;',
 258.0: 'Glaxo welc 50mg;',
 569.0: nan,
 140.0: 'dfafdg ghjgjkgk hgk',
 863.0: nan,
 504.0: 'Doxicycline',
 675.0: 'water'
 }

drugs = ['cycline', 'advil', 'penicilin', 'penicillin', 'tylenol', 'ibuprofen']

data =   dict([(k, val) for k, val in data.items() if(val)])#this was supposed to clean the dict
data = dict((k, v) for k, v in data.items() if v)#so is this but I still get KeyError nan
dDrugs = {}
for drugsuffix in drugs:
    drugre = re.compile(r'([A-Za-z][a-z]{4,}%s)[^a-z]'%(drugsuffix.lower(),))
    for key, value in data.items():
        for chtxt in data[value]:
            for m in drugre.finditer(chtxt+" "):
                drugname = m.group(1)
                dDrugs[key].append(drugname.lower())

#been stuck here like forever!                

#Error
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-118-0a4cff097dc9> in <module>()
      7     drugre = re.compile(r'([A-Za-z][a-z]{4,}%s)[^a-z]'%
(drugsuffix.lower(),))
      8     for key, value in data.items():
----> 9         for chtxt in data[value]:
     10             for m in drugre.finditer(chtxt+" "):
     11                 drugname = m.group(1)

KeyError: nan

我该怎么解决这个问题?实现我的最终目标?非常感谢。在


Tags: infordata字典valueitemsvalnan
1条回答
网友
1楼 · 发布于 2024-09-29 22:27:36

您的词典未被清理,因为np.nan的行为与None不同。具体来说

>>>bool(np.nan)
True

但是

^{pr2}$

所以

{k: v for k, v in data.items() if v == v}

会清理你的字典。在

对于您的问题,将嵌套循环替换为

for k, v in data.items():
    dDrugs[k] = [drug for drug in drugs if drug in v.lower()]

似乎有用。在

对于添加列,您应该能够对包含键的任何列使用.map(dDrugs)。在

编辑: 要在部分匹配中提取全名,可以使用基于药物的regex的findall方法:

drugs = [re.compile('\S*'+drug) for drug in drugs]
for k, v in data.items():
    dDrugs[k] = [drug for drug_suffix in drugs
                 for drug in drug_suffix.findall(v.lower())]
dDrugs
Out[1482]: 
{55.0: [],
 140.0: [],
 258.0: [],
 504.0: ['doxicycline'],
 530.0: ['tylenol'],
 675.0: [],
 748.0: ['advil'],
 817.0: ['penicilin', 'ibuprofen'],
 993.0: ['penicillin']}

findall返回一个列表,这需要双重理解。我在这里使用的regex只接受所有非空白字符,如果有的话,在给定后缀返回到最后一个空白字符(如果有的话)之前。对于完整的数据集,您可能需要更复杂的数据集。在

相关问题 更多 >

    热门问题