我有一个带有空单元格的数据框,我需要在一定的比例间隔内填充先前值的平均值。该示例的部分数据框:
code scale s1 s2 s3
1111 -8 4 17 21
1111 -7 14 46 33
1111 -6 31 47 23
1111 -5 8 41 44
1111 -4 17 8 20
1111 -3 9 53 28
1111 -2 5 3 9
1111 -1 7 2 32
1111 0 4 39 31
1111 1 NaN NaN NaN
1111 2 NaN NaN NaN
1111 3 NaN NaN NaN
1111 4 NaN NaN NaN
1111 5 NaN NaN NaN
2222 -8 27 29 45
2222 -7 51 15 43
2222 -6 16 1 28
2222 -5 6 29 52
2222 -4 25 10 5
2222 -3 5 53 22
2222 -2 9 41 6
2222 -1 49 2 17
2222 0 21 9 7
2222 1 NaN NaN NaN
2222 2 NaN NaN NaN
2222 3 NaN NaN NaN
2222 4 NaN NaN NaN
2222 5 NaN NaN NaN
3333 -8 54 17 17
3333 -7 32 34 5
3333 -6 15 48 23
3333 -5 32 15 45
3333 -4 35 10 41
3333 -3 15 29 50
3333 -2 34 43 29
3333 -1 48 54 14
3333 0 27 51 37
3333 1 NaN NaN NaN
3333 2 NaN NaN NaN
3333 3 NaN NaN NaN
3333 4 NaN NaN NaN
3333 5 NaN NaN NaN
....
scale
介于1
和5
之间的每个时间间隔均为空。我需要找到每个这样的间隔,并用scale
和0
之间的-4
对应的列值的平均值填充它。例如,我们为列code
找到1111
s1
的第一个空单元格,其中在17, 9, 5, 7, 4
值中找到平均值并填充后面的空单元格code
1111
和scale
从1
到5
的值。因此,有必要为每列和每个空间隔执行此操作。每个唯一code
对应列的值,其中scale
来自-8
到5
。可以有许多代码,可能有多个列,例如s1
,s2
和s3
。但scale
总是从-8
到5
。我将举例说明计算值。我希望它更容易理解。
code scale s1 s2 s3
1111 -8 4 17 21
1111 -7 14 46 33
1111 -6 31 47 23
1111 -5 8 41 44
1111 -4 17 8 20
1111 -3 9 53 28
1111 -2 5 3 9
1111 -1 7 2 32
1111 0 4 39 31
1111 1 8.4 21 24
1111 2 8.4 21 24
1111 3 8.4 21 24
1111 4 8.4 21 24
1111 5 8.4 21 24
2222 -8 27 29 45
2222 -7 51 15 43
2222 -6 16 1 28
2222 -5 6 29 52
2222 -4 25 10 5
2222 -3 5 53 22
2222 -2 9 41 6
2222 -1 49 2 17
2222 0 21 9 7
2222 1 21.8 23 11.4
2222 2 21.8 23 11.4
2222 3 21.8 23 11.4
2222 4 21.8 23 11.4
2222 5 21.8 23 11.4
3333 -8 54 17 17
3333 -7 32 34 5
3333 -6 15 48 23
3333 -5 32 15 45
3333 -4 35 10 41
3333 -3 15 29 50
3333 -2 34 43 29
3333 -1 48 54 14
3333 0 27 51 37
3333 1 31.8 37.4 34.2
3333 2 31.8 37.4 34.2
3333 3 31.8 37.4 34.2
3333 4 31.8 37.4 34.2
3333 5 31.8 37.4 34.2
....
任何想法如何做到这一点?
答案 0 :(得分:3)
我认为code
是数据帧的索引。
首先,获取平均值:
df[df['scale'].between(-4, 0)].groupby(level=0).mean()
返回:
scale s1 s2 s3
code
1111 -2 8.40 21.00 24.00
2222 -2 21.80 23.00 11.40
3333 -2 31.80 37.40 34.20
第二次,使用combine_first
分配值,该值仅替换NaN
个值:
df.combine_first(df[df['scale'].between(-4, 0)].groupby(level=0).mean())