Python 在数据帧中为NaN添加值时出现问题

Python 在数据帧中为NaN添加值时出现问题,python,dataframe,for-loop,nan,Python,Dataframe,For Loop,Nan,我有这个数据框: 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值。为此,我

我有这个数据框:

    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']
最后,我想循环数据帧中的每一行。将每行“描述”列中的内容拆分,如果该单词也在“关键字”列表中,则将其添加到“制造商”列中。例如,它将如下所示:

    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
为False。可能有点违反直觉=),但这意味着最后一个条件永远不应该生效。从你的问题中不太清楚你看到的是相同的结果还是没有结果

如果你改变了

对于i,枚举中的描述(test3['description']):

对于i,zip中的描述(test3.loc[test3['manufacturer'].isna(),:].index,test3.loc[test3['manufacturer'].isna(),'description']):
那么我认为它应该很好用。您只能得到“制造商”为NaN的行。您还可以删除
==np.nan
部分,因为非空字符串的计算结果为True,而np.nan的计算结果为False,但这会使代码更难理解

有很多方法可以让代码看起来更好;)但是专注于学习调试,剩下的就来了。只要它做了你想让它做的事,谁在乎呢

一种调试方法是在循环中打印条件的每个部分的真值

print(bool(关键字中的word.lower())
打印(bool(test3.loc[i,'manufacturer']==np.nan)
致以最良好的祝愿

编辑:好的,我应该补充一下我自己会怎么做

df=pd.DataFrame({'manufacturer':['toyota',np.nan,np.nan,np.nan],
‘描述’:[‘丰田,通用汽车10年历史’,‘通用汽车,汽车运行和驱动良好’,‘旧汽车,碎片’,‘2车主0生锈。凯迪拉克.]})
关键词=['gmc'、'toyota'、'cadillac']
filler=df['description'].map(lambda s:[如果s.lower()中有单词,则关键字中的单词对应于单词][0]
if bool([关键字if word in s.lower()]中的逐字逐句)
(np.nan)
df['manufacturer']=df['manufacturer'].fillna(填料)
当关键字中的最后一项或第一项都出现在字符串tho中时,不确定是否要将其设置为关键字中的最后一项或第一项。我使用索引0将其设置为此处的第一项