1 回答

TA貢獻1884條經驗 獲得超4個贊
np.nan == np.nan是假的。也許有點違反直覺=)但這應該意味著最后一個條件永遠不應該生效。從你的問題中不清楚你是否看到相同的結果或沒有結果。
如果你改變了
for i, description in enumerate(test3['description']):
到
for i, description in zip(test3.loc[test3['manufacturer'].isna(), :].index, test3.loc[test3['manufacturer'].isna(), 'description']):
那么我認為它應該可以正常工作。您只會獲得“制造商”為 NaN 的行。您也可以刪除該== np.nan部分,因為非空字符串的計算結果為 True,而 np.nan 的計算結果為 False,但這會使您的代碼更難理解。
有很多方法可以讓你的代碼看起來更好;)但是專注于學習調試,剩下的就會水到渠成。只要它能做你想做的事,誰在乎呢。
調試此問題的一種方法是打印循環(huán)內條件每個部分的真值。
print(bool(word.lower() in keyword))
print(bool(test3.loc[i, 'manufacturer'] == np.nan)
最好的祝愿!
編輯:好的,我可能應該添加我自己如何做到這一點。
df = pd.DataFrame({'manufacturer': ['toyota', np.nan, np.nan, np.nan],
'description': ['toyota, gmc 10 years old.', 'gmc, Motor runs and drives good.', 'Motor old, in pieces.', '2 owner 0 rust. Cadillac.']})
keyword = ['gmc', 'toyota', 'cadillac']
filler = df['description'].map(lambda s: [word for word in keyword if word in s.lower()][0]
if bool([word for word in keyword if word in s.lower()])
else np.nan)
df['manufacturer'] = df['manufacturer'].fillna(filler)
當關鍵字中的最后一項或第一項出現(xiàn)在字符串中時,不確定您是否想要關鍵字中的最后一項或第一項。我使用索引 0 將其設置為此處的第一項。
添加回答
舉報