[英]Trouble when adding values for NaN in DataFrame
我有這個數據幀:
manufacturer description
0 toyota toyota, gmc 10 years old.
1 NaN gmc, Motor runs and drives good.
2 NaN Motor old, in pieces.
3 NaN 2 owner 0 rust. Cadillac.
我想用從描述中獲取的關鍵字填充 NaN 值。 為此,我創建了一個包含我想要的關鍵字的列表:
keyword = ['gmc', 'toyota', 'cadillac']
最后,我想遍歷 DataFrame 中的每一行。 將“描述”列中的內容拆分為每一行,如果該詞也在“關鍵字”列表中,則將其添加到“制造商”列中。 例如,它看起來像這樣:
manufacturer description
0 toyota toyota, gmc 10 years old.
1 gmc gmc, Motor runs and drives good.
2 NaN Motor old, in pieces.
3 cadillac 2 owner 0 rust. Cadillac.
感謝這個社區的某個人,我可以改進我的代碼:
import re
keyword = ['gmc', 'toyota', 'cadillac']
bag_of_words = []
for i, description in enumerate(test3['description']):
bag_of_words = re.findall(r"""[A-Za-z\-]+""", test3["description"][i])
for word in bag_of_words:
if word.lower() in keyword:
test3.loc[i, 'manufacturer'] = word.lower()
但我意識到第一行也改變了值,即使它不是 NaN:
manufacturer description
0 gmc toyota, gmc 10 years old.
1 gmc gmc, Motor runs and drives good.
2 NaN Motor old, in pieces.
3 cadillac 2 owner 0 rust. Cadillac.
我只想更改 NaN 值,但是當我嘗試添加時:
if word.lower() in keyword and test3.loc[i, 'manufacturer'] == np.nan:
它沒有任何效果。
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 但這會使您的代碼更難理解。
有很多方法可以讓您的代碼看起來更好 ;) 但專注於學習調試,其余的就會到來。 只要它做你想做的事,誰在乎。
您可以調試的一種方法是在循環內打印條件的每個部分的真值。
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)
當兩者都出現在字符串中時,不確定您想要關鍵字中的最后一項還是第一項。 我使用索引 0 將其設置為此處的第一項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.