我需要帮助修改部分代码。我之前已经问过这个问题。 Here is the link。但是,现在我需要多次找到平均值。
原始数据框的示例如下所示:
code scale year week a b c
1111 -5 2017 15 68 68 19
1111 -4 2017 16 30 95 24
1111 -3 2017 17 21 15 94
1111 -2 2017 18 67 30 16
1111 -1 2017 19 10 13 13
1111 0 2017 20 26 22 18
1111 1 2017 21 NaN NaN NaN
1111 2 2017 22 NaN NaN NaN
1111 3 2017 23 NaN NaN NaN
1111 4 2017 24 NaN NaN NaN
1111 5 2017 25 NaN NaN NaN
1111 6 2017 26 NaN NaN NaN
2222 -5 2017 15 13 19 21
2222 -4 2017 16 24 95 23
2222 -3 2017 17 22 32 76
2222 -2 2017 18 21 30 12
2222 -1 2017 19 15 55 17
2222 0 2017 20 23 22 23
2222 1 2017 21 NaN NaN NaN
2222 2 2017 22 NaN NaN NaN
2222 3 2017 23 NaN NaN NaN
2222 4 2017 24 NaN NaN NaN
2222 5 2017 25 NaN NaN NaN
2222 6 2017 26 NaN NaN NaN
....
比例的间隔可能不同,但我事先知道。并且计算应该从比例= 0的位置开始。在每个周期从1到6的示例中,我需要使用-5到0范围内的先前值来计算平均值。和以前一样,使用新的计算值。计算的本质是计算code
中scale
列中从-5到6的每个唯一位置的平均值。尽管列{{1}中的所有值的间隔相同1}},但唯一值的数量可以不同。所以我想为每个从-5到6的间隔写一个循环,但我不能。还存在这样的问题:作为code
的列数可能不同。我需要为-5到6的每个间隔申请这个代码。
a, b, c
结果应如下所示:
import numpy as np
import pandas as pd
#data is your dataframe name
column_list = list(data.columns.values)[4:]
for column_name in column_list :
column = data[column_name].values
#converted pandas series to numpy series
for index in xrange(0,column.shape[0]):
#iterating over entries in the column
if np.isnan(column[index]):
column[index] = np.nanmean(column.take(range(index-5,index+1),mode='wrap'))
我会非常感谢任何帮助!
UPD 列code scale year week a b c
1111 -5 2017 15 68 68 19
1111 -4 2017 16 30 95 24
1111 -3 2017 17 21 15 94
1111 -2 2017 18 67 30 16
1111 -1 2017 19 10 13 13
1111 0 2017 20 26 22 18
1111 1 2017 21 37 41 31
1111 2 2017 22 32 36 33
1111 3 2017 23 32 26 34
1111 4 2017 24 34 28 24
1111 5 2017 25 28 28 25
1111 6 2017 26 32 30 27
2222 -5 2017 15 13 19 21
2222 -4 2017 16 24 95 23
2222 -3 2017 17 22 32 76
2222 -2 2017 18 21 30 12
2222 -1 2017 19 15 55 17
2222 0 2017 20 23 22 23
2222 1 2017 21 20 42 29
2222 2 2017 22 21 46 30
2222 3 2017 23 20 38 31
2222 4 2017 24 20 39 24
2222 5 2017 25 20 40 26
2222 6 2017 26 21 38 27
...
包含单个设备代码。列code
显示特定周和年中每个区域中的设备数。任务是使用已知值的平均值来预测未来日期中每个区域中每个代码的设备数量。为了便于计算,需要该比例。例如,取代码a,b,c
。列1111
。 a
范围内scale
的已知值。对于他们,计算比例为(-5,0)
的单元格的平均值。它将是1
。对于下一个单元格,请获取比例为37
的值。在其中,该值将等于(-4,1)
。依此类推所有单元格,31.833
从scale
到1
。列6
也是如此。我们采用以下代码a, b, c
。我们也为他做同样的事。选择专栏2222
。对于比例为a
的单元格,计算已知值的平均值(1
再次从scale
到-5
,但0
是code
)。我们得到2222
。等等。
每个唯一代码的行数相同(从19.66
到-5
)。但是可能会有很多代码。
我希望我能够更好地解释这个问题。
答案 0 :(得分:1)
我们需要的是一种获得移动平均线的方法 - 我可能是错的,但我认为没有适当的功能来处理大熊猫(我想这是考虑到大熊猫确实有ewa()和rolling_mean()实现,可能会或可能不会令人惊讶。
,这对我来说在这里使用递归是有道理的$scope.fnRemoveTag = function (index) {
$scope.list.splice(index, 1);
}
答案 1 :(得分:1)
假设您的数据与提供的示例相同,您可以这样做
from
我认为你可能有更多列的平均值而不仅仅是a,b和c,但这种方法都有效。此外,我们可以执行一些布尔索引来查找colSelector = df.columns.values[4:]
for index,row in df.iterrows():
if np.isnan(row[4:].values).any():
col = colSelector[np.isnan(row[4:].values)]
df.loc[index,col] = np.round(df.loc[index-6:index,col].mean(),0)
值,而不是循环遍历每个列,而是选择对它们求平均值,从而消除第一个循环。
注意:如果它只是a-c列,并且这些列之后确实有数据不是平均值,请将所有NaN
更改为[4:]