代码之家  ›  专栏  ›  技术社区  ›  Gopikrishna X Gopalakrishnan

具有列表长度的pandas groupby

  •  0
  • Gopikrishna X Gopalakrishnan  · 技术社区  · 3 年前

    我需要在dataframe列中显示用户id和内容id的长度,这是一个列表对象。但在使用groupby时却很难做到这一点。 请在groupby和我在本文底部提出的问题上提供帮助(我如何在dataframe中获得结果和用户id?)

    数据帧类型:

    df.dtypes
    

    输出:

    user_id       object
    content_id    object
    dtype: object
    

    样本数据:

        user_id     content_id
    0   user_18085  [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19...
    1   user_16044  [cont_2738_2_49, cont_4482_2_19, cont_4994_18_...
    2   user_13110  [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19...
    3   user_18909  [cont_3170_2_28]
    4   user_15509  [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19...
    

    熊猫查询:

    df.groupby('user_id')['content_id'].count().reset_index()
    
    df.groupby(['user_id'])['content_id'].apply(lambda x: get_count(x))
    

    输出:

        user_id     content_id
    0   user_10013  1
    1   user_10034  1
    2   user_10042  1
    

    当我尝试不分组时,我的情况如下所示-

    df['content_id'].apply(lambda x: len(x))
    
    
    0       11
    1        9
    2       11
    3        1
    

    但是,如何在dataframe中获得结果和用户id?就像我想要下面的格式-

    user_id   content_id
    some xxx  11
    some yyy  6
      
    
    1 回复  |  直到 3 年前
        1
  •  0
  •   Arnau    3 年前

    pandas.Groupby 返回一个grouper元素,而不是每个单元格的内容。因此,你不可能(没有很多变通办法)做你想做的事。相反,你需要简单地重写这些列(正如@ifly6所建议的那样)

    使用

    df_agg = df.copy()
    df_agg.content_id = df_agg.content_id.apply(len)
    df_agg = df_agg.groupby('user_id').sum()
    

    将产生与 Groupby 你描述的。

    为完整起见,单个groupby的说明如下:

    df.groupby('user_id').agg(lambda x: x.apply(len).sum())
    
        2
  •  0
  •   Golden Lion    3 年前

    尝试将内容id转换为字符串,用逗号拆分,然后重新组合为列表列表,然后计算列表项。

    data="""index  user_id     content_id
    0   user_18085  [cont_2598_4_4,cont_2738_2_49,cont_4482_2_19]
    1   user_16044  [cont_2738_2_49,cont_4482_2_19,cont_4994_18_]
    2   user_13110  [cont_2598_4_4,cont_2738_2_49,cont_4482_2_19]
    3   user_18909  [cont_3170_2_28]
    4   user_15509  [cont_2598_4_4,cont_2738_2_49,cont_4482_2_19]
    """
    df = pd.read_csv(StringIO(data), sep='\s+')
    
    def convert_to_list(x):
        x=re.sub(r'[\[\]]', '', x)
        lst=list(x.split(','))
        return lst
    
    df['content_id2']= [list() for x in range(len(df.index))]
    for key,item in df.iterrows():
        lst=convert_to_list(str(item['content_id']))
        for item in lst:
            df.loc[key,'content_id2'].append(item)
        
    def count_items(x):
        return len(x)
    
    df['count'] = df['content_id2'].apply(count_items)
    df.drop(['content_id'],axis=1,inplace=True)
    df.rename(columns={'content_id2':'content_id'},inplace=True)
    print(df)
    

    输出:

     index     user_id                                       content_id  count
    0      0  user_18085  [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19]      3
    1      1  user_16044  [cont_2738_2_49, cont_4482_2_19, cont_4994_18_]      3
    2      2  user_13110  [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19]      3
    3      3  user_18909                                 [cont_3170_2_28]      1
    4      4  user_15509  [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19]      3
    ​