计算列中第n个元素的平均值,并在pandas

时间:2017-08-29 15:41:11

标签: python pandas

我需要帮助修改部分代码。我之前已经问过这个问题。 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范围内的先前值来计算平均值。和以前一样,使用新的计算值。计算的本质是计算codescale列中从-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。列1111a范围内scale的已知值。对于他们,计算比例为(-5,0)的单元格的平均值。它将是1。对于下一个单元格,请获取比例为37的值。在其中,该值将等于(-4,1)。依此类推所有单元格,31.833scale1。列6也是如此。我们采用以下代码a, b, c。我们也为他做同样的事。选择专栏2222。对于比例为a的单元格,计算已知值的平均值(1再次从scale-5,但0code)。我们得到2222。等等。 每个唯一代码的行数相同(从19.66-5)。但是可能会有很多代码。

我希望我能够更好地解释这个问题。

2 个答案:

答案 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:]