我有一个以下结构的数据框,它针对这个问题的范围进行了简化:
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行为空白,平均值受存在的纳米数量的影响。
答案 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)
希望这会对你有所帮助。 :)