Замена значений на основе вхождения слова в строку другого столбца
Не могу понять, как сделать следующее:
Есть столбец keyword и столбец text.
Что я хочу сделать? - если есть определенное слово в строке столбца text, то мы заменяем в этой же строке, НО В СТОЛБЦЕ keyword значение NaN на это слово.

Что я пытался сделать? - заменил для удобства NaN на 0
train['keyword'] = train['keyword'].fillna(0)
далее решил пройтись по каждой строке столбца text, где keyword 0.
a = train.query('keyword == 0')
for i in a['text']:
if 'fire' in i:
a.keyword.replace(0, 'fire', inplace=True)
Как мы видим, заменились все 0 на данное слово.
P.S.
- Также пытался пройтись по двум циклам (цикл в цикле)
- Пытался заменить по индексу, соответсвующему индексу вхождения в строку слова.
Ссылка на полный df
Спасибо!
Ответы (1 шт):
Всё довольно просто, но надо уметь мыслить по-пандовски, "векторно":
import pandas as pd
df = pd.read_csv('train.csv')
word = 'fire'
df.loc[(df.text.str.contains(word)) & (df.keyword.isna()),'keyword'] = word
df
Вывод:
id keyword ... text target
0 1 NaN ... Our Deeds are the Reason of this #earthquake M... 1
1 4 fire ... Forest fire near La Ronge Sask. Canada 1
2 5 NaN ... All residents asked to 'shelter in place' are ... 1
3 6 fire ... 13,000 people receive #wildfires evacuation or... 1
4 7 fire ... Just got sent this photo from Ruby #Alaska as ... 1
... ... ... ... ... ...
7608 10869 NaN ... Two giant cranes holding a bridge collapse int... 1
7609 10870 fire ... @aria_ahrary @TheTawniest The out of control w... 1
7610 10871 NaN ... M1.94 [01:04 UTC]?5km S of Volcano Hawaii. htt... 1
7611 10872 NaN ... Police investigating after an e-bike collided ... 1
7612 10873 fire ... The Latest: More Homes Razed by Northern Calif... 1
[7613 rows x 5 columns]
Я правда тут проверяю просто вхождение как подстроки, если надо по совпадению целых слов в предложении проверять, то надо будет ещё подумать.
Поясняю, что происходит в строке
df.loc[(df.text.str.contains(word)) & (df.keyword.isna()),'keyword'] = word
df.text.str.contains(word)- делаем "маску", отмечая какTrueте строки, у которых в столбцеtextсодержится слово из переменнойworddf.keyword.isna()- делаем "маску", отмечая какTrueте строки, у которых в столбцеkeywordсодержитсяNA- ("маска")&("маска") - объединяем две маски через логическое &, скобки в данном случае обязательны
df.loc["маска",'keyword'] = word- берём те строки, у которых в "маске" стоит True и в них берём столбецkeyword, ну и пишем в этот столбец наше слово во все эти выбранные строки
