Переименование нескольких значений столбца в Pandas - PullRequest
1 голос
/ 06 апреля 2020

У меня есть отзывы клиентов, хранящиеся в Pandas столбце «Чувство». Это результат data['Sentiment'].unique():

array(['Negative', 'Positive', '?', 'Neutral', 'nan', 'positive',
       'neutral', 'negative', 'Neg', 'ppos', 'ne'], dtype=object)

Я пытаюсь сгруппировать значения в «положительный», «отрицательный» и «нейтральный» и создал три списка сопоставления:

positive = ['Positive','positive', 'ppos']
negative = ['Negative', 'negative', 'Neg']
neutral = ['Neutral', 'neutral', 'ne']

Все остальное должно быть NAn. У меня была попытка с iterrows() в соответствии с:

for idx, row in data.iterrows():
    if row['Sentiment'].isin(positive):
        row['Sentiment'] == 'positive'
               ...

Не работает и тоже не кажется эффективным. Я пробовал использовать Series и booleans, и это кажется многообещающим подходом, но мне действительно интересно, есть ли какой-нибудь краткий обходной путь.

Ответы [ 3 ]

3 голосов
/ 06 апреля 2020

Используйте numpy .select . Передайте условия в качестве первого аргумента, значения, соответствующие условиям в качестве второго, и значение по умолчанию, которое не соответствует ни одному условию.

import numpy as np

conditions = [
    df['Sentiment'].isin(positive),
    df['Sentiment'].isin(neutral),
    df['Sentiment'].isin(negative)
]
values = ['positive', 'neutral', 'negative']

df['Sentiment'] = np.select(conditions, values, np.nan)
1 голос
/ 06 апреля 2020

Вы можете создать словарь, соединив старые значения с новыми, и заменить содержимое столбца чувств через pandas ' map

  #list of old and new values
old_values = [['Positive','positive', 'ppos'],
              ['Negative', 'negative', 'Neg'],
              ['Neutral', 'neutral', 'ne']]

new_values = ['positive','negative','neutral']

merge = zip(new_values,old_values)

#create mapping
d = {}
for new, old in merge:
    for i in old:
        d[i] = new

print(d)

{'Positive': 'positive',
 'positive': 'positive',
 'ppos': 'positive',
 'Negative': 'negative',
 'negative': 'negative',
 'Neg': 'negative',
 'Neutral': 'neutral',
 'neutral': 'neutral',
 'ne': 'neutral'}

#apply mapping to series:
df.Sentiment.map(d)
1 голос
/ 06 апреля 2020

Использование pd.apply

def sentiment_group(sentiment):
    if sentiment in ['Positive','positive', 'ppos']:
        return 'positive'
    if sentiment in ['Negative', 'negative', 'Neg']:
        return 'negative'
    if sentiment in ['Neutral', 'neutral', 'ne']:
        return 'neutral'
    else:
        return sentiment

data['sentiment_group'] = data['Sentiment'].apply(sentiment_group)
...