【问题标题】:Grouping transactions description and count in python在python中对事务描述和计数进行分组
【发布时间】:2019-12-09 21:44:49
【问题描述】:

我有一个包含交易的数据框。我想将类似的交易组合在一起,并在 python 中为单个客户计算这些交易的发生。 数据如下所示:

account   transaction_date  transaction description   transaction_amt
55625       15/may/19          POS: McDonalds             $15
55625       01/may/19          Netflix                    $31.5
55625       28/may/19          POS:H&M                    $150
55625       6/apr/19           Netflix                    $9
55625       30/may             McDonalds                  $6
55625       25/may/19          POS:H&M                    $32
55625       6/mar/19           POS:H&M                    $32

我希望以这样的方式对数据进行分组,以便计算一个月内光顾商店的次数和总花费 它应该是这样的:

account   trans_date  trans_description   total_spent    
55625       may/19        McDonalds          $21
55625       may/19           H&M             $182
55625       mar/19           H&M             $32
55625       may/19          Netflix          $31.5
55625       apr/19          Netflix          $9

【问题讨论】:

    标签: python python-3.x pandas jupyter-notebook


    【解决方案1】:

    您尝试过使用df.groupby() 吗?

    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

    如果你熟悉的话,它的工作原理类似于 SQL 的 group by。

    【讨论】:

      【解决方案2】:

      首先,您需要将 transaction_date(dd/mmm/yy) 转换为 trans_date(mmm/yy)。您可以使用 datetime 库或 dateutil 库。然后通过删除诸如 "POS:"

      之类的不需要的词,从 transaction_description 创建一个新列 trans_description

      然后你可以在 pandas 库中使用groupby() 函数。分组依据(日期和描述列) https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

      【讨论】:

        【解决方案3】:

        第一个处理日期时间列,删除 description 列中 : 之前的值,并从 transaction_amt 中删除 $ 并转换为数字:

        df['transaction_date'] = (pd.to_datetime(df['transaction_date'], 
                                                format='%d/%b/%y', errors='coerce')
                                    .dt.strftime('%b/%y'))
        df['transaction description'] = df['transaction description'].str.split(':').str[-1]
        df['transaction_amt'] = df['transaction_amt'].str.lstrip('$').astype(float)
        print (df)
        
           account transaction_date transaction description  transaction_amt
        0    55625           May/19               McDonalds             15.0
        1    55625           May/19                 Netflix             31.5
        2    55625           May/19                     H&M            150.0
        3    55625           Apr/19                 Netflix              9.0
        4    55625              NaT               McDonalds              6.0
        5    55625           May/19                     H&M             32.0
        6    55625           Mar/19                     H&M             32.0
        

        然后汇总总和:

        df1 = (df.groupby(['account','transaction_date','transaction description'])['transaction_amt']
                 .sum()
                 .reset_index(name='total_spent'))
        print (df1)
           account transaction_date transaction description  total_spent
        0    55625           Apr/19                 Netflix          9.0
        1    55625           Mar/19                     H&M         32.0
        2    55625           May/19                     H&M        182.0
        3    55625           May/19               McDonalds         15.0
        4    55625           May/19                 Netflix         31.5
        5    55625              NaT               McDonalds          6.0
        

        如果输入数据在日期时间列中始终是年份,则解决方案是:

        print (df)
           account transaction_date transaction description transaction_amt
        0    55625        15/may/19           POS:McDonalds             $15
        1    55625        01/may/19                 Netflix           $31.5
        2    55625        28/may/19                 POS:H&M            $150
        3    55625         6/apr/19                 Netflix              $9
        4    55625        30/may/19               McDonalds              $6
        5    55625        25/may/19                 POS:H&M             $32
        6    55625         6/mar/19                 POS:H&M             $32
        
        
        df['transaction_date'] = df['transaction_date'].str.split('/', n=1).str[1]
        df['transaction description'] = df['transaction description'].str.split(':').str[-1]
        df['transaction_amt'] = df['transaction_amt'].str.lstrip('$').astype(float)
        print (df)
           account transaction_date transaction description  transaction_amt
        0    55625           may/19               McDonalds             15.0
        1    55625           may/19                 Netflix             31.5
        2    55625           may/19                     H&M            150.0
        3    55625           apr/19                 Netflix              9.0
        4    55625           may/19               McDonalds              6.0
        5    55625           may/19                     H&M             32.0
        6    55625           mar/19                     H&M             32.0
        
        df1 = (df.groupby(['account','transaction_date','transaction description'])['transaction_amt']
                 .sum()
                 .reset_index(name='total_spent'))
        print (df1)
           account transaction_date transaction description  total_spent
        0    55625           apr/19                 Netflix          9.0
        1    55625           mar/19                     H&M         32.0
        2    55625           may/19                     H&M        182.0
        3    55625           may/19               McDonalds         21.0
        4    55625           may/19                 Netflix         31.5
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-13
          • 1970-01-01
          • 2017-06-15
          • 2015-12-10
          • 1970-01-01
          • 2017-11-07
          • 2017-02-17
          相关资源
          最近更新 更多