Сгруппируйте данные по двум столбцам и сосчитайте их, используя панд - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующие данные.

  1. песни
  2. play_event

В песнях данные следующие:

song_id  total_plays
1        2000
2        4532
3        9999
4        2343

А в случае воспроизведения данные выглядят следующим образом:

user_id song_id
102         1
103         4
102         1
102         3
104         2
102         1

При каждом воспроизведении песни появляется новая запись, даже если песня воспроизводится снова.

С этими данными я хочу:

  1. Получить всего нет.времени каждый пользователь играл каждую песню.Например, если воспроизводится user_id 102, song_id 1 три раза, как указано выше.Я хочу, чтобы он был сгруппирован по user_id с общим количеством.Примерно так:

    user_id  song_id  count
    102      1        3
    102      3        1
    103      4        1
    104      2        1
    

Я думаю об использовании Панд для этого.Но я хочу знать, является ли панда правильным выбором.

Если это не панды, то каким должен быть мой путь вперед.

Если Pandas - правильный выбор, то:

Приведенный ниже код позволяет мне получить счет, сгруппированный по пользователю или сгруппированный по user_id, как мы можем получить счетсгруппированы по user_id & song_id?Смотрите пример кода, который я попробовал ниже:

import pandas as pd

#Load data from csv file
data = pd.DataFrame.from_csv('play_events.csv')

# Gives how many entries per user
data['user_id'].value_counts()

# Gives how many entries per songs
data['song_id'].value_counts()

1 Ответ

0 голосов
/ 11 октября 2018

Для вашей первой проблемы, простой групповой и value_counts делает свое дело.Обратите внимание, что все, что указано после кода value_counts() в приведенном ниже коде, это просто приведение его к фактическому кадру данных в том же формате, что и требуемый вывод.

counts = play_events.groupby('user_id')['song_id'].value_counts().to_frame('count').reset_index()

>>> counts
   user_id  song_id  count
0      102        1      3
1      102        3      1
2      103        4      1
3      104        2      1

Затем для вашей второй проблемы (которую вы удалили в своемотредактированный пост, но я уйду на всякий случай, если он будет вам полезен), вы можете перебрать counts, группировать по user_id и сохранить каждый как csv:

for user, data in counts.groupby('user_id', as_index=False):
    data.to_csv(str(user)+'_events.csv')

Для вашего примера с фреймами данныхэто дает вам 3 csv с: 102_events.csv, 103_events.csv и 103_events.csv.Первый выглядит так:

   user_id  song_id  count
0      102        1      3
1      102        3      1
...