在熊猫中实施多日平均值

时间:2017-05-19 11:55:14

标签: python pandas dataframe

我有一个以下结构的数据框,它针对这个问题的范围进行了简化:

  A        B        C          E F G 
0 location 2016/9/1 2016/9/1   n 2 1 
1 location 2016/9/2 2016/9/2   2 n 2 
2 location 2016/9/3 2016/9/3   1 1 1 
3 location 2016/9/4 2016/9/4   1 n n  
4 location 2016/9/5 2016/9/5   1 1 1 
5 location 2016/9/6 2016/9/6   1 n n 
6 location 2016/9/7 2016/9/7   1 n 1  
7 location 2016/9/8 2016/9/8   1 1 1  
8 location 2016/9/9 2016/9/9   1 1 1  

其中s是字符串值并涵盖日期和时间以及其他数据,n是np.nan值,f是浮点值。

我想要做的是创建一个数据框,其前4列有2或3列,并从那里创建7天的运行平均值。我可以这样设置一个滚动窗口:

df = df.rolling(7).mean()

然而,这只会产生一个只有nan值的数据帧,其中所有f值都位于上面的示例中。

我尝试的另一种方法如下:

pandas groupby and rolling_apply ignoring NaNs

然而,对于我的代码,它不会输出我正在寻找的正确值。

我的目标是创建一个7天的运行/移动平均线,它可以计算纳米值,并且只能计算非纳米值的平均值。

使用上面的数据框作为示例输入我想要实现的是以下输出:

  A        B        C          E   F   G    
0 location 2016/9/1 2016/9/1   n   n   n   
1 location 2016/9/2 2016/9/2   n   n   n   
2 location 2016/9/3 2016/9/3   n   n   n   
3 location 2016/9/4 2016/9/4   n   n   n    
4 location 2016/9/5 2016/9/5   n   n   n    
5 location 2016/9/6 2016/9/6   n   n   n   
6 location 2016/9/7 2016/9/7   7/6 4/3 6/4  
7 location 2016/9/8 2016/9/8   8/7 1   6/4 
8 location 2016/9/9 2016/9/9   1   1   1   

在第6/7/8行中,计算累计运行/移动平均值,前7行为空白,平均值受存在的纳米数量的影响。

1 个答案:

答案 0 :(得分:0)

这是我能想到的最简单的方法,但这肯定可以改进:

import numpy as np
import pandas as pd

# setup DataFrame
A = ['location']*9
B = pd.date_range(start='2016/9/1', periods=9)
C = pd.date_range(start='2016/9/1', periods=9)
E = [np.NaN, 2, 1, 1, 1, 1, 1, 1, 1]
F = [2, np.NaN, 1, np.NaN, 1, np.NaN, np.NaN, 1, 1]
G = [1, 2, 1, np.NaN, 1, np.NaN, 1, 1, 1]

df = pd.DataFrame(list(zip(A, B, C, E, F, G)), columns=['A', 'B', 'C', 'E', 'F', 'G'])

# compute values for columns E, F, and G
df_ = df.loc[:, ['E', 'F', 'G']]
numerator = df_.fillna(0).rolling(window=7, min_periods=7).sum()
denominator = df_.notnull().astype(int).rolling(window=7).sum()

# New DataFrame containing results for columns E, F, and G
new_df = numerator / denominator

# final DataFrame
final_df = df[['A', 'B', 'C']].join(new_df)

希望这会对你有所帮助。 :)