代码之家  ›  专栏  ›  技术社区  ›  esafwan

将数据按两列分组,并使用pandas进行计数

  •  0
  • esafwan  · 技术社区  · 8 年前

    我有以下数据。

    1. 歌曲
    2. 播放\u事件

    歌曲中的数据如下:

    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. 获取每个用户播放每首歌曲的总时间。例如,如果用户id 102 1 三次,根据上述数据。我想按用户id和总计数对它进行分组。如下所示:

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

    我想用熊猫来做这个。但我想知道熊猫是不是正确的选择。

    如果不是熊猫,那我该怎么办呢。

    如果熊猫是正确的选择,那么:

    下面的代码允许我获取按用户分组或按用户id分组的计数我们如何获取按用户id分组的计数&歌曲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 回复  |  直到 8 年前
        1
  •  1
  •   sacuL    8 年前

    对于第一个问题,一个简单的groupby和 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\ U事件.csv . 第一个看起来像:

       user_id  song_id  count
    0      102        1      3
    1      102        3      1