#python #pandas #dataframe #count #group-by
#python #pandas #фрейм данных #подсчет #группировка по
Вопрос:
В python, учитывая список оценок как:
import pandas as pd
path = 'ratings_ml100k.csv'
data = pd.read_csv(path,sep= ',')
print(data)
user_id item_id rating
28422 100 690 4
32020 441 751 4
15819 145 265 5
где элементы находятся:
print(itemsTrain)
[ 690 751 265 ..., 1650 1447 1507]
Для каждого элемента я хотел бы вычислить количество оценок. Есть ли способ сделать это, не прибегая к циклу? Все идеи приветствуются,
data
является фреймом данных pandas. Вывод desire должен выглядеть следующим образом:
pop =
item_id rating_count
690 120
751 10
265 159
... ...
Обратите внимание, что itemsTrain
содержат уникальные идентификаторы item_ids в наборе данных рейтингов data
.
Комментарии:
1. Какой тип
data
?2. в python нет типа «dataframe», вы имеете в виду pandas. DataFrame ?
3. Извините, вы правы. Я имел в виду pandas. Фрейм данных, как вы упомянули.
4. любая реализация будет использовать
loop
концепцию за кулисами — невозможно что-то сделать для каждого элемента массива без итерации / рекурсии — что именно вы имеете в виду «не прибегая к циклу»?5. Это и многое другое находится в quickstart 10 Минут для pandas , ознакомьтесь с этим.
Ответ №1:
вы можете сделать это таким образом:
In [200]: df = pd.DataFrame(np.random.randint(0,8,(15,2)),columns=['id', 'rating'])
In [201]: df
Out[201]:
id rating
0 4 6
1 0 1
2 2 4
3 2 5
4 2 7
5 3 5
6 6 1
7 4 3
8 4 3
9 3 2
10 2 4
11 7 7
12 3 1
13 2 7
14 7 3
In [202]: df.groupby('id').rating.count()
Out[202]:
id
0 1
2 5
3 3
4 3
6 1
7 2
Name: rating, dtype: int64
если вы хотите получить результат в виде DF (вы также можете назвать count
столбец по своему усмотрению):
In [206]: df.groupby('id').rating.count().to_frame('count').reset_index()
Out[206]:
id count
0 0 1
1 2 5
2 3 3
3 4 3
4 6 1
5 7 2
вы также можете подсчитать количество уникальных оценок:
In [203]: df.groupby('id').rating.nunique()
Out[203]:
id
0 1
2 3
3 3
4 2
6 1
7 2
Name: rating, dtype: int64
Комментарии:
1. Отлично. Это то, что я имел в виду, говоря «без цикла». Однако, почему вы группируете по
id
и что в этом случае означают уникальные оценки? у нас есть несколько пользователей, которые оценили ряд элементов с определенными оценками. Спасибо за разъяснение
Ответ №2:
Вы можете использовать метод df.groupby()
для группировки элементов по item_id
, а затем использовать метод count()
для суммирования оценок.
Выполните следующие действия :
# df is your dataframe
v # the method allows you to sum values of the previous feature
df.groupby('item_id').rating.count()
^ ^ # the feature you want to sum upon its values
^
# The method allows you to group the samples by the feature "item_id"
# which is supposed to be unique
Комментарии:
1. Разве это не та же логика, что и существующий ответ?
2. @PadraicCunningham : Да, это то же самое. Извините, я писал ответ, когда он уже был опубликован.
3. Спасибо. Я хочу переименовать новый столбец. Я пытался
cnt = data.groupby('item_id').rating.count() cnt.columns = ['item_id','count']
, но во втором столбце по-прежнему нет никакой метки. Как я могу это исправить?4. @yasyasi,
data.groupby('item_id').rating.count().to_frame('count').reset_index()