Создайте новый DataFrame с сгруппированными соотношениями из существующего DataFrame - PullRequest
1 голос
/ 25 апреля 2019

У меня есть Dataframe со следующими столбцами («Пользователь», «ProdCode», «Sentiment», «Review»), где «ProdCode» содержит коды продуктов, а «Sentiment» содержит значения 0, 1, 2., а «Отзыв» содержит текстовую рецензию строки.См. Пример ниже:

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]

Я пытаюсь создать DataFrame, который группирует «ProdCode» и показывает 3 соотношения:

1) Количество строк, где Sentiment = 0 / Total NumОтзывов для кода продукта

2) Количество строк, где настроение = 1 / общее количество отзывов для кода продукта

3) Количество строк, где настроение = 2 / общее количество отзывовдля кода продукта

Выглядит примерно так:

ProdCode  SentimentRatio0  SentimentRatio1  SentimentRatio2
X1        .67              0                .33                
X2        0                .33              .67
X3        0                0                1.00 

Я пробовал много неудачных созданий новых полей в Dataframe, код ниже.

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 Ответ

1 голос
/ 25 апреля 2019

Создайте новый фрейм данных, соединив два отдельных результата группы данных.Первый будет группировать по «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
...