2017-06-14 29 views
-2

我試圖創建一個新的字典dDrugs通過從data字典(帶有一串字符串值)提取drugs的列表以及與提取的藥物關聯的密鑰(無論多少個鍵具有相同的藥物作爲值)。我的目標是使用來自dDrugs字典中的值來創建一個新列在現有大熊貓據幀dFrame,使用鍵來定位和填充在數據幀相應的記錄。到目前爲止,這裏是我得到的:如何處理錯誤:numpy.float64沒有可迭代和KeyError異常:楠快譯通?

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 

我該如何解決這個問題?並實現我的最終目標?謝謝。

回答

0

你的字典裏是沒有得到清理,因爲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返回一個列表,這需要雙重理解。我在這裏使用的正則表達式只是在給定後綴返回最後一個空白字符之前(如果有的話)取所有非空白字符(如果有的話)。對於你的完整數據集,你可能想要更復雜的東西。

+0

這肯定是最快的解決方案,我已經在這個平臺上收到。非常感謝。我給出了一個反饋,因爲我測試了這一點。 – CodeLearner

+0

你好EFT,嵌套循環替換你提供像變魔術一樣的作品,這讓我的代碼運行速度更快......謝謝你! – CodeLearner

+0

唯一的問題是,它完全適用於全名拼寫的藥物。例如,有許多後綴爲「cycline」的藥物,如doxicycline,tetracycline等。因此,我沒有列出所有的cycline藥物,而是將cycline列入我的藥物列表,並希望代碼能夠將藥物與這樣的後綴。我一直在試圖看看如何調整你的循環來產生這樣的輸出,但一直沒有成功。你可以看一下嗎?謝謝! – CodeLearner