Как изменить определенные значения столбца в фрейме данных?

У меня есть следующий фрейм данных:

Sentiment_Label Sentiment_Score Удовлетворен 0,882621 Расстроенный 0,826413 Удовлетворен 0,893627 Удовлетворен 0,863469 Расстроенный 0,982447

Я хочу вычесть баллы настроений всех значений «Разочарование» на 1. Это будет желаемый результат:

Sentiment_Label Sentiment_Score Удовлетворен 0,882621 Расстроенный 0,173587 Удовлетворен 0,893627 Удовлетворен 0,863469 Расстроенный 0,017553

Я попытался использовать метод groupby(), чтобы разделить значения на два разных столбца, но полученные значения NaN затруднили выполнение дополнительных вычислений. Я также хочу сохранить столбцы одинаковыми.

Датафрейм

df = pd.DataFrame({'Sentiment_Label': ["Satisfied", "Disappointed", "Satisfied", "Satisfied", "Disappointed"],
                   'Sentiment_Score': [0.882621, 0.826413, 0.893627, 0.863469, 0.982447],
                  })
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
76
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

вы можете попробовать следующее:

df.loc[df['Sentiment_Label'] == 'Disappointed', 'Sentiment_Score'] -= 1

Применив это, вы получите:

Sentiment_Label Sentiment_Score Удовлетворен 0,882621 Расстроенный -0,173587 Удовлетворен 0,893627 Удовлетворен 0,863469 Расстроенный -0,017553

Вы можете использовать apply() в каждой строке и определить функцию, которая выполняет 1 - Sentiment_Score, если значение Sentiment_Label равно Disappointed:

# Function to apply to each row of dataframe
def sub_1(x):
    if x['Sentiment_Label'] == 'Disappointed':
        x["Sentiment_Score"] = 1-x["Sentiment_Score"]
    return x

# Dataframe definition
df = pd.DataFrame({
    'Sentiment_Label': ["Satisfied", "Disappointed", "Satisfied", "Satisfied", "Disappointed"],
    'Sentiment_Score': [0.882621, 0.826413, 0.893627, 0.863469, 0.982447],
})

# Apply function to dataframe by rows 
df = df.apply(sub_1, axis=1)

df значение после apply():

  Sentiment_Label  Sentiment_Score
0       Satisfied         0.882621
1    Disappointed         0.173587
2       Satisfied         0.893627
3       Satisfied         0.863469
4    Disappointed         0.017553

Вы можете зациклить df, используя df.iterrows(). Затем вы сравниваете значение столбца и используете df.at() для доступа к значению и замены.

for i, v in df.iterrows():
    if (v["Sentiment_Label"] == 'Disappointed'):
        df.at[i, 'Sentiment_Score'] = 1 - v["Sentiment_Score"]

print(df)

вне:

  Sentiment_Label  Sentiment_Score
0       Satisfied         0.882621
1    Disappointed         0.173587
2       Satisfied         0.893627
3       Satisfied         0.863469
4    Disappointed         0.017553

Не зацикливайтесь на фреймах данных. Вы почти всегда получаете удар по производительности, и есть много неинтуитивных поведений.

Paul H 13.04.2023 23:39

Вы также можете использовать функцию np.where, которая работает точно так же, как функция MS-Excel if.

import numpy as np
( df['Sentiment_Score']= 
np.where(df.Sentiment_Label='Disappointed',df['Sentiment_Score']-1,
df['Sentiment_Score']
)

 

Вы можете использовать rsub:

m = df['Sentiment_Label'].eq('Disappointed')
df.loc[m, 'Sentiment_Score'] = df['Sentiment_Score'].rsub(1)

Выход:

  Sentiment_Label  Sentiment_Score
0       Satisfied         0.882621
1    Disappointed         0.173587
2       Satisfied         0.893627
3       Satisfied         0.863469
4    Disappointed         0.017553
df.update( df[df.iloc[:,0].eq("Disappointed")].iloc[:,1].sub(1).abs() )

print(df)
  Sentiment_Label  Sentiment_Score
0       Satisfied         0.882621
1    Disappointed         0.173587
2       Satisfied         0.893627
3       Satisfied         0.863469
4    Disappointed         0.017553

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