Создайте новый фрейм данных с Сгруппированными соотношениями из Существующего фрейма данных

#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.