使用pandas

时间:2017-09-05 12:21:15

标签: python pandas

我有一个带有空单元格的数据框,我需要在一定的比例间隔内填充先前值的平均值。该示例的部分数据框:

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介于15之间的每个时间间隔均为空。我需要找到每个这样的间隔,并用scale0之间的-4对应的列值的平均值填充它。例如,我们为列code找到1111 s1的第一个空单元格,其中在17, 9, 5, 7, 4值中找到平均值并填充后面的空单元格code 1111scale15的值。因此,有必要为每列和每个空间隔执行此操作。每个唯一code对应列的值,其中scale来自-85。可以有许多代码,可能有多个列,例如s1s2s3。但scale总是从-85。我将举例说明计算值。我希望它更容易理解。

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
....            

任何想法如何做到这一点?

1 个答案:

答案 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())