#python #python-3.x #dataframe #group-by #calculation
#python #python-3.x #фрейм данных #группировать по #вычисление
Вопрос:
У меня есть фрейм данных со следующими столбцами («User», «ProdCode», «Sentiment», «Review»), где «ProdCode» содержит коды продуктов, а «Sentiment» содержит значения 0, 1, 2, а «Review» содержит текстовую строку review. Смотрите пример ниже:
User ProdCode Sentiment Review
User1 X1 0 [string]
User2 X1 0 [string]
User3 X1 2 [string]
User4 X2 1 [string]
User5 X2 2 [string]
User6 X2 1 [string]
User7 X3 2 [string]
User8 X3 2 [string]
Я пытаюсь создать фрейм данных, который группирует «ProdCode» и показывает 3 соотношения:
1) Количество строк, где отношение = 0 / Общее количество отзывов для кода продукта
2) Количество строк, где отношение = 1 / Общее количество отзывов для кода продукта
3) Количество строк, где отношение = 2 / Общее количество отзывов для кода продукта
Выглядит примерно так:
ProdCode SentimentRatio0 SentimentRatio1 SentimentRatio2
X1 .67 0 .33
X2 0 .33 .67
X3 0 0 1.00
Я пробовал много неудачных попыток создания новых полей в фрейме данных, код приведен ниже.
DFF['sent0_ratio'] = [(count(DFF[sentiment])) if x == "0" else "0" for x in DFF.sentiment]
или
DFF['sent0_ratio'] = sum(DFF['sentiment' if x == 0 for x in DFF.sentiment].groupby(DFF['ProdCode']).mean(), 2)
Ни один из них не работает должным образом. Я даже не думаю, что я близок.
Ответ №1:
Создайте новый фрейм данных, объединив два отдельных результата группы фреймов данных. Первый будет сгруппирован по «ProdCode» и «Sentiment», второй будет сгруппирован по «ProdCode», чтобы получить общее количество для «ProdCode». Присоединяйтесь к «ProdCode» и ограничьте столбцы «Review» и Review_r»
df1 = (
df.groupby(["ProdCode", "Sentiment"])
.count()
.join(df.groupby("ProdCode").count(), "ProdCode", rsuffix="_r")
)[['Review', 'Review_r']]
df1
Review Review_r
ProdCode Sentiment
X1 0 2 3
2 1 3
X2 1 2 3
2 1 3
X3 2 2 2
Вычислите «Review» / «Review_r», восстановите индекс по столбцам и сведите к окончательному результату.
df1['result'] = df1['Review']/df1['Review_r']
df1 = df1.reset_index()
df1 = df1.pivot("ProdCode", 'Sentiment','result').fillna(0)
Окончательный фрейм данных:
Sentiment 0 1 2
ProdCode
X1 0.666667 0.000000 0.333333
X2 0.000000 0.666667 0.333333
X3 0.000000 0.000000 1.000000
Комментарии:
1. Это именно то, что я искал. Спасибо @run-out! Одно из последующих действий: как мне преобразовать новые столбцы в%?
2. Еще одно дополнение — цель этого для меня состоит в том, чтобы взять этот фрейм данных и создать новый фрейм данных, включающий только ProdCode и все обзоры для этого Prod-кода, выбрав только ProdCode, где мой новый столбец ‘0’> .50, например, как бы я это создал? Я пытаюсь получить список продуктов и обзоров в фрейме данных, который имел наименьшее соотношение настроений.
3. Не уверен, что вы подразумеваете под преобразованием в проценты, но, возможно, вы имеете в виду, чтобы оно выглядело как 66%? В этом случае просто df1 = df * 100, затем df1.astype(‘int’), создайте новый фрейм данных, если вы хотите сохранить значения в первом df
4. Я не уверен, что понимаю ваш второй вопрос, но в любом случае, похоже, что это должен быть новый вопрос. Приветствия,
5. Вам придется сбрасывать исходный файл df при каждом его запуске. Попробуйте запустить его из исходного определения первого фрейма данных. Возможно, также очистите свои ядра, если вы используете Jupyter.