Python 在熊猫中实施多天平均值

Python 在熊猫中实施多天平均值,python,pandas,dataframe,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

我有一个数据框架,其结构如下,针对本问题的范围进行了简化:

  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为浮点值

我想做的是创建一个dataframe,它有前4列中的2列或3列,并从那里创建一个7天的运行平均值。我可以设置如下滚动窗口:

df = df.rolling(7).mean()
然而,这只会生成一个只有nan值的数据帧,在上面的示例中,所有f值都位于nan值处

我尝试过的另一种方法是:

但是,对于我的代码,它没有输出我正在寻找的正确值

我的目标是创建一个7天运行/移动平均值,该平均值可以解释nan值,并且仅对非nan值进行平均

使用上面的数据帧作为示例输入,我希望实现以下输出:

  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行为空,平均值受存在的nan值数量的影响。

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

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)

希望这对您有所帮助。:)

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

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)

希望这对您有所帮助。:)

你能给出一个你的输入和期望输出的具体例子吗?用澄清的输入和输出更新。添加一些你不能汇总的实际日期,并用随机数或数字替换
f
so@cd123,我想你可以做
df.fillna(0).rolling(window=7).mean()
。但我不确定,因为您确实给出了一个如何计算G列到L列的示例。另外,是否要对A列到D列执行聚合?为了便于计算/使用,我将其简化为数据帧。理想情况下,我希望保持与每行相关的数据保持不变,A列至C列保持不变,但如果可能,在B/C列中设置移动平均线的开始和结束日期,我可以轻松提取移动平均线,然后如上所示计算7天运行平均线。您能给出一个输入和期望输出的具体示例吗?更新为澄清输入和输出。添加一些无法聚合的实际日期,并用随机数或数字替换
f
so@cd123,我想你可以做
df.fillna(0).rolling(window=7).mean()
。但我不确定,因为您确实给出了一个如何计算G列到L列的示例。另外,是否要对A列到D列执行聚合?为了便于计算/使用,我将其简化为数据帧。理想情况下,我希望保持与每行相关的数据保持不变,A列至C列保持不变,但如果可能,在B/C列中设置移动平均线的开始和结束日期,我可以轻松提取,然后按照上面所示计算7天运行平均线。这似乎是我可以使用的,只要稍微调整一下,就应该很好了。非常感谢:)这看起来是我可以使用的东西,只需要稍微调整一下,它应该是好的。非常感谢:)