【发布时间】:2015-07-29 21:04:49
【问题描述】:
您好,我无法从 python 中的滚动均值和 groupby 函数创建所需的输出。下面是我的数据框的快照....
var_x = range(0, 12)
var_y = range(20, 44, 2)
var_z = range(0, 60, 5)
ID = ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c']
df = DataFrame(zip(ID, var_x, var_y, var_z), columns = ['id', 'var_x', 'var_y', 'var_z'])
df
id var_x var_y var_z
a 0 20 0
a 1 22 5
a 2 24 10
a 3 26 15
b 4 28 20
b 5 30 25
b 6 32 30
b 7 34 35
b 8 36 40
c 9 38 45
c 10 40 50
c 11 42 55
利用这些数据,我试图完成 3 件事: - 首先,我想使用 groupby 为“id”字段计算滚动平均值。我可以为单个列执行此操作,但不能针对每个数字字段(var_y,var_z),使用以下代码。
df.groupby('id')['var_x'].apply(pd.rolling_mean, 3)
-
其次,我希望前 3 个 ID 的平均值填充当前 ID,而当前 ID 的值不包含在当前滚动平均迭代中(可能有移位?)。例如,一个看起来像这样的输出......
0 NaN NaN NaN 1 NaN NaN NaN 2 NaN NaN NaN 3 1 22 5 4 NaN NaN NaN 5 NaN NaN NaN 6 NaN NaN NaN 7 5 30 25 8 6 32 30 9 NaN NaN NaN 10 NaN NaN NaN 11 NaN NaN NaN
注意第 4 个“a”是前 3 个 a 的平均值。第 4 个和第 5 个 b 也是如此(取前 3 个平均值的值,同时排除其自身的值)。
-
第三,对于以“NaN”结尾的 ID(每个新 ID 的前三个),我想迭代地将窗口从 3 减小到 1(如果可能),以便唯一具有 NaN 的值是每个 ID 的第一个实例。所需的输出将是...
0 NaN NaN NaN 1 0 20 0 2 0.5 21 2.5 3 1 22 5 4 NaN NaN NaN 5 4 28 20 6 4.5 29 22.5 7 5 30 25 8 6 32 30 9 NaN NaN NaN 10 9 38 45 11 9.5 39 47.5
注意第 3 个 a 是前 2 个 a 的平均值。第二个 a 是第一个等的值...
任何帮助将不胜感激。
【问题讨论】:
-
我建议您将问题分成不同的帖子。
-
这是一个公平的观点,但我认为在这种情况下做 3 可能还可以,只有第三个需要很多努力。
-
谢谢,问题的第三部分对我个人来说是一个令人费解的问题......但仍然非常感谢您对第一部分的任何帮助。