Изменение значения столбца фрейма данных pandas в соответствии с условиями

У меня есть фрейм данных pandas, который содержит отзывы. И для каждого обзора у меня есть разные слова с определенной оценкой, как показано ниже:

import pandas as pd
df = pd.DataFrame({
    "review_num": [1,1,1,1,1,2,2,2],
    "review": ["This is the first review","This is the first review","This is the first review","This is the first review","This is the first review",
               "And another one","And another one","And another one"],
    "token_num":[1,2,3,4,5,1,2,3],
    "token":["This","is","the","first","review","And","another","one"],
    "score":[0.3,-0.6,0.5,0.4,0.2,-0.7,0.5,0.4]
})

#The initial dataframe====================================================
#   review_num                    review  token_num    token  score
#0           1  This is the first review          1     This    0.3
#1           1  This is the first review          2       is   -0.6
#2           1  This is the first review          3      the    0.5
#3           1  This is the first review          4    first    0.4
#4           1  This is the first review          5   review    0.2
#5           2           And another one          1      And   -0.7
#6           2           And another one          2  another    0.5
#7           2           And another one          3      one    0.4

Мне нужно изменить каждый отзыв, следуя приведенным ниже правилам: 1- для каждого обзора меняйте мир с наибольшим количеством баллов 2- если слово с наибольшей оценкой содержит символ "t", то замените "t" на "f" 3-если не содержит символа "т", то перейти к следующему слову (с самым важным счетом)

Ожидаемый результат — следующий фрейм данных:


# == the modified df ============================================================
#  review_num            initial_review                     Modified_review
#0           1    This is the first review             This is fhe first review
#1           2           And another one                     And anofher one

Может ли кто-нибудь помочь мне сделать это? Спасибо

Измененное слово в первом обзоре должно быть «the», а не «first».

mozway 20.02.2023 17:18
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
1
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете предварительно отфильтровать строки с «t» в токене, затем получить строку с максимальной оценкой с помощью groupby.idxmax , наконец, использовать понимание списка для выполнения замены и присоединиться к оригиналу:

m = df['token'].str.contains('t')
idx = df[m].groupby('review_num')['score'].idxmax()

out = df.loc[idx, ['review_num', 'review']].join(
    pd.DataFrame({'Modified_review': [txt.replace(w, w.replace('t', 'f'))
                                      for w, txt in zip(df.loc[idx, 'token'],
                                                    df.loc[idx, 'review'])]
                  }, index=idx)
)

Выход:

   review_num                    review           Modified_review
2           1  This is the first review  This is fhe first review
6           2           And another one           And anofher one

Большое спасибо @mozway, ваш код у меня работает правильно. Но я не понимаю, почему мы должны использовать этот раздел zip(df.loc[idx, 'token'],df.loc[idx, 'review']) вместо только df.loc[idx, 'review']. Я пытался использовать этот последний код, но он выдал мне ошибку. Не могли бы вы объяснить мне больше, пожалуйста?

SLA 21.02.2023 11:28

@SLA это потому, что мы используем здесь понимание списка python. zip из двух столбцов быстрее, чем итерация по строке DataFrame (вам нужно было бы использовать iterrows или itertuples) ;)

mozway 21.02.2023 11:36

Большое спасибо! Вы правы, я забыл использовать iterrows

SLA 21.02.2023 11:44

Другие вопросы по теме