如何忽略nan值并计算最近3个月的平均值

时间:2018-12-14 10:49:34

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

我已上传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
--------------

2 个答案:

答案 0 :(得分:2)

使用dropna删除NaN的行并通过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()              

答案 1 :(得分:0)

耶斯列尔的答案很好。如果您想向后进行多个周期的分析,可以通过计算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()
相关问题