【问题标题】:how to ignore nan values and calculate mean of last 3 months如何忽略 nan 值并计算过去 3 个月的平均值
【发布时间】:2019-05-15 15:18:13
【问题描述】:

我上传了 6 个月的数据 7 月 - 12 月

这是我的字典数据

print(UPI_TransferIn)

输出:

[{'UPI TransferIn amt': 3000.0, 'date': '11-10-2018', 'No of UPI Transaction': 1}, {'UPI TransferIn amt': 560.0, 'date': '25-09-2018', 'No of UPI Transaction': 1}, {'UPI TransferIn amt': 3000.0, 'date': '14-09-2018', 'No of UPI Transaction': 1}, {'UPI TransferIn amt': 6984.0, 'date': '09-07-2018', 'No of UPI Transaction': 1}]

我的代码

    Avg_per_month = df.groupby(pd.Grouper(key='date', freq='1M')).mean()                                                             
    Avg_of_3_Month = df.groupby(pd.Grouper(key='date', freq='1M')).mean().last("3M")
    total_Avg_of_3_Months = Avg_of_3_Month['UPI TransferIn amt'].mean()              

    print("\nAverage UPI Transaction-In per month :\n ", Avg_per_month)                            
    print("Total Average UPI Transaction-In in last 3 months : ", total_Avg_of_3_Months)    

我得到的结果:

--------------

Average UPI Transaction-In per month :
          No of UPI Transaction  UPI TransferIn amt
Date                                             
Jul-18                      1              6984.0
Aug-18                      0                 NaN
Sep-18                      2              1780.0
Oct-18                      1              3000.0
--------------
Total Average UPI Transaction-In in last 3 months :  2390.0
--------------

我希望目前计算 7 月、9 月、10 月之间的平均值 即使我写了last("3M"),它也是在 9 月和 10 月计算的。

预期结果:

--------------
Total Average UPI Transaction-In in last 3 months :  3921.33333
--------------

【问题讨论】:

  • 也许解释你想要获得的东西会更容易,而不是必须遵循你的代码似乎没有做你想做的事
  • 您期望的平均值是多少?你能把这些具体的价值观放在你的问题中吗?
  • @SandervandenOord :我已经编辑了我的问题以便于理解,请您再次检查

标签: python-3.x pandas dataframe pandas-groupby


【解决方案1】:

使用dropna 删除NaNs 行并通过tail 获取最后3 行:

Avg_of_3_Month = (df.groupby(pd.Grouper(key='date', freq='1M'))
                    .mean()
                    .dropna(subset=['UPI TransferIn amt'])
                    .tail(3))

total_Avg_of_3_Months = Avg_of_3_Month['UPI TransferIn amt'].mean()              

【讨论】:

    【解决方案2】:

    Jezrael 的回答很棒。如果您想向后执行多个周期,可以通过计算 rolling 平均值来实现:

    your_data = [{'UPI TransferIn amt': 3000.0, 'date': '11-10-2018', 'No of UPI Transaction': 1}, {'UPI TransferIn amt': 560.0, 'date': '25-09-2018', 'No of UPI Transaction': 1}, {'UPI TransferIn amt': 3000.0, 'date': '14-09-2018', 'No of UPI Transaction': 1}, {'UPI TransferIn amt': 6984.0, 'date': '09-07-2018', 'No of UPI Transaction': 1}]
    df = pd.DataFrame(your_data)
    
    df['period'] = pd.to_datetime(df['date'], dayfirst=True).dt.to_period('M')
    group = df.groupby('period')['UPI TransferIn amt'].mean()
    average_3months = group.rolling(window=3, center=False).mean()
    

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 1970-01-01
      • 2018-09-15
      • 2022-01-07
      • 2014-09-03
      • 1970-01-01
      • 2021-08-18
      • 2012-06-03
      相关资源
      最近更新 更多