How do I deal with Error: numpy.float64 not iterable and KeyError: nan in Dict?
How do I deal with Error: numpy.float64 not iterable and KeyError: nan in Dict?
我正在尝试通过从 data
字典(带有一堆字符串值)中提取 drugs
的列表以及与之关联的键来创建新字典 dDrugs
提取的药物(无论有多少键具有相同的药物作为值)。我的目标是使用 dDrugs
字典中的值在现有 pandas 数据帧 dFrame
中创建一个新列,使用键在数据帧中定位和填充适当的记录。到目前为止,这是我得到的:
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
我该怎么做才能解决这个问题?实现我的最终目标?谢谢。
您的字典没有被清理,因为 np.nan
的行为不像 None
。具体来说,
>>>bool(np.nan)
True
然而,
>>>np.nan == np.nan
False
所以
{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)
。
编辑:
要在部分匹配中提取全名,您可以使用基于药物的正则表达式的 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
returns 一个列表,需要双重理解。我在这里使用的正则表达式只接受所有非空白字符(如果有的话),在给定的后缀返回到最后一个空白字符(如果有的话)之前。对于您的完整数据集,您可能需要更复杂的东西。
我正在尝试通过从 data
字典(带有一堆字符串值)中提取 drugs
的列表以及与之关联的键来创建新字典 dDrugs
提取的药物(无论有多少键具有相同的药物作为值)。我的目标是使用 dDrugs
字典中的值在现有 pandas 数据帧 dFrame
中创建一个新列,使用键在数据帧中定位和填充适当的记录。到目前为止,这是我得到的:
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
我该怎么做才能解决这个问题?实现我的最终目标?谢谢。
您的字典没有被清理,因为 np.nan
的行为不像 None
。具体来说,
>>>bool(np.nan)
True
然而,
>>>np.nan == np.nan
False
所以
{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)
。
编辑:
要在部分匹配中提取全名,您可以使用基于药物的正则表达式的 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
returns 一个列表,需要双重理解。我在这里使用的正则表达式只接受所有非空白字符(如果有的话),在给定的后缀返回到最后一个空白字符(如果有的话)之前。对于您的完整数据集,您可能需要更复杂的东西。