【问题标题】:Count number of purchases a user has done on a pandas dataframe计算用户在 pandas 数据框中完成的购买次数
【发布时间】:2020-02-11 09:57:20
【问题描述】:

我有一个 pandas 数据框,其中包含订单和对书籍文件的简单访问,我想获得一个单独的数据框,我可以在其中查看每个用户的订单并放弃访问。

这是我的数据框格式的示例:

    number  type   username   product   order_code  order_datetime    model    price
0     1     order   alicia7    130365       ...        ...            ebook     5.99
1     1     order   alicia7    130365       ...        ...            ebook     5.99
2     4    access   7762hc      65487       ...        ...           printed   15.45
3     3    access   kylemm      45878       ...        ...            ebook     7.99
4     1     order   john5       32054       ...        ...           printed   18.99

数字仅表示用户访问图书文件的次数。所以,我想要达到的结果是,一个新的数据框,我有一个用户的每个订单,如果我可以将用户购买的同一本书分组,那就更好了,比如,添加一个用户购买的同一本书的总金额的新列。像这样的:

     type   username   product   count  
0   order   alicia7    130365      2       
4   order   john5       32054      1     

这可能吗?

【问题讨论】:

    标签: python pandas python-2.7 dataframe


    【解决方案1】:

    boolean indexing过滤值,然后按GroupBy.size计数:

    print (df[df['type'].eq('order')])
       number   type username  product    model  price
    0       1  order  alicia7   130365    ebook   5.99
    1       1  order  alicia7   130365    ebook   5.99
    4       1  order    john5    32054  printed  18.99
    
    df1 = df[df['type'].eq('order')].groupby(['type','username','product']).size().reset_index(name='count')
    

    或按DataFrame.query过滤:

    df1 = df.query('type=="order"').groupby(['type','username','product']).size().reset_index(name='count')
    
    print (df1)
        type username  product  count
    0  order  alicia7   130365      2
    1  order    john5    32054      1
    

    对于不使用过滤器的所有可能组合:

    df2 = df.groupby(['type','username','product']).size().reset_index(name='count')
    print (df2)
         type username  product  count
    0  access   7762hc    65487      1
    1  access   kylemm    45878      1
    2   order  alicia7   130365      2
    3   order    john5    32054      1
    

    【讨论】:

    • 我已经尝试了这两个选项,但我得到一个空数据框
    • @SarahKerrigan - 这意味着order 值不匹配,如果检查print (df['type'].tolist()) 没有像' order' 这样的spme 空格?
    • 是的,抱歉,我遇到了一些问题,哈哈哈,非常感谢
    • @SarahKerrigan - 你需要df1.groupby(['username')['product','count'].agg(list).reset_index() 吗?
    • 这看起来不错,具有项目列表和产品数量的独特用户,我想我可以尝试使用它。太感谢了!!你很好
    【解决方案2】:

    如果我没记错的话,你的代码应该是这样的:

    df_gb = df.groupby(['type','username','product'],as_index=False).agg({'model':'count'}).rename(columns ={'model':'count'})
    orders_filtered_df = df_gb[df_gb.type=='order']
    

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 2022-09-28
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多