Подсчет количества оценок без цикла python

#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()