问题
我有一个函数MovingAverage
,用于计算序列的移动平均值。现在,我正在尝试使用apply()
将此函数应用于DataFrame的列。除第一列外,所有列似乎都工作正常。我无法调试,因为为什么apply()
忽略了DataFrame的第一列。
数据
df1 = pd.DataFrame({'Action':np.random.randint(0, 11, 10),
'Adventure':np.random.randint(0, 11, 10),
'Comedy':np.random.randint(0, 11, 10),
'Fantasy':np.random.randint(0, 11, 10),
'Drama':np.random.randint(0, 11, 10)})
代码
# function: MovingAverage()
def MovingAverage(xSeries, MA_Limit = 1):
MA_Series = pd.Series(np.zeros(len(xSeries), dtype=float))
for i in range(MA_Limit, len(xSeries)):
MA_Series[i] = np.mean(xSeries[i-MA_Limit:i])
j = MA_Limit
while j > 0:
MA_Series[j-1] = np.mean(xSeries[0:j])
j = j-1
return MA_Series
这是实际的函数调用,
df.apply(MovingAverage, axis=1, MA_Limit=5)
当前输出
预期产量
移动平均过滤器应用于每列
答案 0 :(得分:0)
第一列不变,因为标量的均值是相同的值。
似乎需要rolling
和axis=1
来处理行:
np.random.seed(456)
df1 = pd.DataFrame({'Action':np.random.randint(0, 11, 10),
'Adventure':np.random.randint(0, 11, 10),
'Comedy':np.random.randint(0, 11, 10),
'Fantasy':np.random.randint(0, 11, 10),
'Drama':np.random.randint(0, 11, 10)})
print (df1)
Action Adventure Comedy Fantasy Drama
0 5 5 0 3 10
1 9 2 9 3 5
2 10 4 10 5 1
3 10 2 8 10 6
4 4 2 2 6 1
5 5 8 3 6 5
6 7 4 6 3 10
7 1 8 7 8 9
8 8 5 0 9 1
9 3 6 0 6 4
#also first column is noct changed
df2 = df1.rolling(3, min_periods=1, axis=1).mean()
print (df2)
Action Adventure Comedy Fantasy Drama
0 5.0 5.0 3.333333 2.666667 4.333333
1 9.0 5.5 6.666667 4.666667 5.666667
2 10.0 7.0 8.000000 6.333333 5.333333
3 10.0 6.0 6.666667 6.666667 8.000000
4 4.0 3.0 2.666667 3.333333 3.000000
5 5.0 6.5 5.333333 5.666667 4.666667
6 7.0 5.5 5.666667 4.333333 6.333333
7 1.0 4.5 5.333333 7.666667 8.000000
8 8.0 6.5 4.333333 4.666667 3.333333
9 3.0 4.5 3.000000 4.000000 3.333333
#first row is not changed, because rolling mean per columns (default axis=0)
df3 = df1.rolling(3, min_periods=1).mean()
print (df3)
Action Adventure Comedy Fantasy Drama
0 5.000000 5.000000 0.000000 3.000000 10.000000
1 7.000000 3.500000 4.500000 3.000000 7.500000
2 8.000000 3.666667 6.333333 3.666667 5.333333
3 9.666667 2.666667 9.000000 6.000000 4.000000
4 8.000000 2.666667 6.666667 7.000000 2.666667
5 6.333333 4.000000 4.333333 7.333333 4.000000
6 5.333333 4.666667 3.666667 5.000000 5.333333
7 4.333333 6.666667 5.333333 5.666667 8.000000
8 5.333333 5.666667 4.333333 6.666667 6.666667
9 4.000000 6.333333 2.333333 7.666667 4.666667
答案 1 :(得分:0)
仅需使用rolling()
函数即可应用移动平均线。对于2号窗口,
df1.rolling(window=[![enter image description here][1]][1]2).mean()