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天运行平均线。这似乎是我可以使用的,只要稍微调整一下,就应该很好了。非常感谢:)这看起来是我可以使用的东西,只需要稍微调整一下,它应该是好的。非常感谢:)