#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