Как автоматически создать новый столбец после value_counts в Panda?

#python #pandas

Вопрос:

Это данные

Рейтинг Цен Рейтинг Продуктов Питания Рейтинг обслуживания
1 1 2
4 5 5
3 4 3
5 5 1
1 1 5

Рейтинги варьируются только от 1 до 5. Есть ли способ выполнить подсчет значений в таблице оценок и автоматически создать новый столбец для группировки подсчетов?

Добавление нового столбца вручную после value_counts возможно, но должен быть более изящный способ?

Другими словами, как изменить таблицу выше на таблицу ниже?:

Подсчет Рейтинга Цен Подсчет Рейтинга Продуктов Питания Подсчет Рейтинга Обслуживания Оценка
2 2 1 1
0 0 1 2
1 0 1 3
1 1 0 4
1 2 2 5

Ответ №1:

melt затем crosstab

 s = df.melt()
out = pd.crosstab(s.value,s.variable)
out
Out[228]: 
variable  Food Rating  Price Rating  Service Rating
value                                              
1                   2             2               1
2                   0             0               1
3                   0             1               1
4                   1             1               0
5                   2             1               2
 

Комментарии:

1. Мило! Это работает.

Ответ №2:

Ответ Бени великолепен, и использование SQLite может быть еще одним вариантом, в принципе, union all часть-это расплав, case when часть-перекрестная таблица`:

     df2 = pd.DataFrame(
        {
            "Price Rating": [1, 4, 3, 5, 1],
            "Food Rating": [1, 4, 4, 5, 1],
            "Service Rating": [2, 5, 3, 5, 1]
        }
    )
    con = sqlite3.connect('data.sqlite')
    cur = con.cursor()
    df2.to_sql("rating", con, if_exists="replace")
    con.execute('''create table result as SELECT count(CASE WHEN variable = 'Price Rating' THEN variable END) "Price Rating Count",
       count(CASE WHEN variable = 'Food Rating' THEN variable END) "Food Rating Count",
       count(CASE WHEN variable = 'Service Rating' THEN variable END) "Service Rating Count",
       val "Rating"
  FROM (
           SELECT 'Price Rating' AS variable,
                  "Price Rating" AS val
             FROM rating
           UNION ALL
           SELECT 'Food Rating' AS variable,
                  "Food Rating" AS val
             FROM rating
           UNION ALL
           SELECT 'Service Rating' AS variable,
                  "Service Rating" AS val
             FROM rating
       )
 GROUP BY val;''')
    output_df = pd.read_sql_query("SELECT * from result", con)
    print (output_df)
    con.commit()
    con.close()
 
    Price Rating Count  Food Rating Count  Service Rating Count  Rating
0                   2                  2                     1       1
1                   0                  0                     1       2
2                   1                  0                     1       3
3                   1                  2                     0       4
4                   1                  1                     2       5