#python #pandas #string #dictionary
Вопрос:
У меня есть следующий словарь
dictionary = {"car":1234, "light-blue":112, "orange":34, "blue":1, "cargo yellow":35}
И следующий фрейм данных
df_data = {"sentence": ["the summarine is a cargo yellow and orange", "the sky was an amazing light-blue, you should have seen it", "the grass is green", "why you face is purple?", "Light blue as you! HAHA", "Have you ever use the Jungle exploration?"], "extra":['a','b','c','d', 'e', 'f'] }
df = pd.DataFrame(df_data)
Основываясь на предыдущем заданном мною вопросе, я использовал этот код:
df['new_col'] = df.sentence.str.extract(pat = f"({'|'.join(dictionary.keys())})")[0]
Но у меня есть две проблемы: первая заключается в том, что в случае, если у меня в предложении несколько ключей словаря, я не могу его извлечь; вторая заключается в том, что он извлекает слово car, даже если его нет. Для решения первой проблемы я использовал следующий код:
df.sentence.str.findall(f"|".join(dictionary.keys())).apply(", ".join)
Что приводит к этому:
0 car, orange
1 light-blue
2
3
4 blue
5
Но все равно у меня проблема с машиной, а в данном случае еще и с синим. Вместо этого я хотел бы иметь вот это:
0 cargo yellow, orange
1 light-blue
2 nan
3 nan
4 nan
5 nan
Кроме того, у вас есть какие-либо предложения о том, как я мог бы изменить код, чтобы вместо этого получить этот результат:
0 cargo yellow, orange
1 light-blue
2 nan
3 nan
4 light blue
5 nan
ИЗМЕНИТЬ: Я попробовал следующий код:
for i in dictionary.keys():
print(i,"n",df.sentence.str.findall(rf'bW?{i}W?b'))
И в этом случае ключ «автомобиль» не извлекается, но не очень эффективен, учитывая, что в моем словаре 3000 ключей/значений.
Спасибо!
Комментарии:
1. Добавьте также несколько строк ваших выборочных данных.
2. Извините, данные были записаны без пробела от«, и поэтому они были скрыты. Добавлен
3.
blue
очевидно , будет совпадатьLight blue
, говоря оcar
том, что я не вижу этого в результирующей строке.4. С кодом, который я предоставил? Я попытался снова запустить код после очистки ядра, но все равно получил результат car.
5. Это как — то не здесь, с моей стороны, но это также ожидается, так
car
как содержится вcargo
Ответ №1:
Подготовка входных данных:
data = {27695: 'I am legit happy because of these news.',
143703: "Something seems suspicious.I can't recognize that...",
...
48645: 'lol.',
185265: 'Maybe there is a chance the infinity war sets are next'}
df = pd.DataFrame({"sentence": data.values()}, index=data.keys())
Найдите полные слова:
out = df.sentence.str.findall('|'.join([fr'b{w}b' for w in dictionary.keys()]))
.apply(lambda l: ','.join(l))
Отображать только совпадающие результаты:
>>> out[out != '']
56082 blue,orange
134801 blue
102078 blue
106617 blue
204968 blue
139796 cargo yellow
Name: sentence, dtype: object
Комментарии:
1. В небольшом наборе данных, который я вам предоставляю, это работает. Но когда я попытался запустить исходную версию, у меня возникла эта ошибка
sequence item 0: expected str instance, tuple found
2. Попробуйте удалить
.apply(lambda l: ','.join(l)
3. Да, я сделал это, и результат примерно такой
[(, , , , , , , , , , , , , , , , , , , )]
: я думаю о том, в чем проблема. В качестве входных данных у меня есть некоторая строка, поэтому она должна работать4. @Ибрагим. Вы решили свою проблему с входными данными? Не забудьте принять и/или озвучить ответ, если он вам помог?
5. Я не решил проблему, и я не знаю, почему. Вы правы, я собираюсь дать вам принять ваш ответ, потому что на небольших данных ваше решение работает