【问题标题】:python pandas - group by two columns and find averagepython pandas - 按两列分组并求平均值
【发布时间】:2023-02-21 15:21:02
【问题描述】:

我有这样的数据框

TxnId     TxnDate           TxnCount
  233     2023-02-01      2
  533     2023-02-01      1
  433     2023-02-01      4
  233     2023-02-02      3
  533     2023-02-02      5
  233     2023-02-03      3
  533     2023-02-03      5
  433     2023-02-03      2

我想计算从今天开始最多过去 3 天的每个 TxnId 的 TxnCount 平均值,并将其放在单独的列中。

让我们说今天 = 2023-02-04。在 2023 年 2 月 1 日之前,我需要 TxnId 的平均 TxnCount。我的预期结果将是。

TxnId     TxnDate           TxnCount     AVG
  233     2023-02-01      2            2
  533     2023-02-01      1            1
  433     2023-02-01      4            4  
  233     2023-02-02      3            2.5  [(3+2)/2]  
  533     2023-02-02      5            3    [(5+1)/2]   
  233     2023-02-03      3            2.66 [(3+3+2)/3]           
  533     2023-02-03      5            3.66 [(5+5+1)/3]  
  433     2023-02-03      2            3    [(2 + 4)/2] Only for two days TxnId is present

你能帮忙如何在 python 中实现这个吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    确保你的 TxnDate 是日期时间类型,然后定义 3 天前

    threedays = (pd.datetime.now().date() - pd.Timedelta(days = 3)).strftime('%Y-%m-%d')
    

    过滤掉

    df = df.loc[df['TxnDate'] >= pd.datetime.now().TxnDate()) & (df['TxnDate'] <= '2000-6-10']
    

    然后分组:

    temp = df.groupby('TxnId', as_index = False).agg(AVG = ('TxnCount', 'mean')
    df.merge(temp, on = ['TxnId'], how = 'inner')
    

    【讨论】:

      【解决方案2】:

      首先在今天和前 3 天之外替换 TxnCount(在样本数据中所有数据匹配),然后每组使用 Series.rolling 并通过 Series.droplevel 删除 MultiIndex

      df['TxnDate'] = pd.to_datetime(df['TxnDate'])
      
      today = pd.to_datetime('2023-02-04')
      
      s = df['TxnCount'].where(df['TxnDate'].between(today - pd.Timedelta('3 days'), today))
      df['AVG'] = s.groupby(df['TxnId']).rolling(3, min_periods=1).mean().droplevel(0)
      print (df)
         TxnId    TxnDate  TxnCount       AVG
      0    233 2023-02-01         2  2.000000
      1    533 2023-02-01         1  1.000000
      2    433 2023-02-01         4  4.000000
      3    233 2023-02-02         3  2.500000
      4    533 2023-02-02         5  3.000000
      5    233 2023-02-03         3  2.666667
      6    533 2023-02-03         5  3.666667
      7    433 2023-02-03         2  3.000000
      

      【讨论】:

      • 我在尝试此解决方案时收到以下错误 TypeError: Cannot compare type 'Timestamp' with type 'date'
      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2022-07-06
      相关资源
      最近更新 更多