У меня есть следующий фрейм данных:
Я хочу вычесть баллы настроений всех значений «Разочарование» на 1. Это будет желаемый результат:
Я попытался использовать метод groupby(), чтобы разделить значения на два разных столбца, но полученные значения NaN затруднили выполнение дополнительных вычислений. Я также хочу сохранить столбцы одинаковыми.
Датафрейм
df = pd.DataFrame({'Sentiment_Label': ["Satisfied", "Disappointed", "Satisfied", "Satisfied", "Disappointed"],
'Sentiment_Score': [0.882621, 0.826413, 0.893627, 0.863469, 0.982447],
})






вы можете попробовать следующее:
df.loc[df['Sentiment_Label'] == 'Disappointed', 'Sentiment_Score'] -= 1
Применив это, вы получите:
Вы можете использовать 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
Вы также можете использовать функцию 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
Не зацикливайтесь на фреймах данных. Вы почти всегда получаете удар по производительности, и есть много неинтуитивных поведений.