根据另一列的值在新数据帧列中应用函数

时间:2017-08-10 13:41:34

标签: pandas numpy dataframe mean calculation

我想在数据帧中应用滚动均值函数。我在数据框中有多个类别(列类别中的A和B),因此我必须计算每个类别的滚动均值,这是我的问题。

Dataframe如下所示。 Rolling_Mean列是预期的结果。

Date        Category    Value   Rolling_Mean
01.01.2017  A           12,30   NaN
02.01.2017  A           12,50   NaN
03.01.2017  A           12,90   12,57
04.01.2017  A           13,10   12,70
05.01.2017  A           12,90   12,74
06.01.2017  A           13,55   12,88
07.01.2017  A           13,12   12,91
01.01.2017  B           1,14    NaN
02.01.2017  B           1,52    NaN
03.01.2017  B           1,74    1,47
04.01.2017  B           2,12    1,63
05.01.2017  B           1,75    1,65
06.01.2017  B           1,69    1,66
07.01.2017  B           1,35    1,62

计算滚动平均值我用pandas滚动:

df['Rolling_Mean'] = df['Value'].rolling (window=3).mean() 

但是我无法计算多个类别的滚动均值。

我曾尝试使用numpy.where(下面)计算这个,但它仅适用于一个类别,我正在寻找解决方案,适用于10个类别。

df['Rolling_Mean'] = np.where((df.Category == 'A'), df['Value'].rolling(window=3).mean(), 0)

2 个答案:

答案 0 :(得分:3)

rolling需要groupby,但输出为Multiindex,因此需要按reset_index删除第一级:

#replace values to floats or use parameter decimal=',' in read_csv
df['Value'] = df['Value'].str.replace(',','.').astype(float)


df['new'] = df.groupby('Category')['Value'].rolling(window=3, min_periods=3).mean()
              .reset_index(level=0, drop=True)
print (df)
          Date Category  Value Rolling_Mean        new
0   01.01.2017        A  12.30          NaN        NaN
1   02.01.2017        A  12.50          NaN        NaN
2   03.01.2017        A  12.90        12,57  12.566667
3   04.01.2017        A  13.10        12,70  12.833333
4   05.01.2017        A  12.90        12,74  12.966667
5   06.01.2017        A  13.55        12,88  13.183333
6   07.01.2017        A  13.12        12,91  13.190000
7   01.01.2017        B   1.14          NaN        NaN
8   02.01.2017        B   1.52          NaN        NaN
9   03.01.2017        B   1.74         1,47   1.466667
10  04.01.2017        B   2.12         1,63   1.793333
11  05.01.2017        B   1.75         1,65   1.870000
12  06.01.2017        B   1.69         1,66   1.853333
13  07.01.2017        B   1.35         1,62   1.596667

答案 1 :(得分:1)

rolling上下文groupby内使用Category。要返回与当前数据帧相同的索引,请使用嵌入transform

中的rolling lambda
df.assign(
    Rolling_Mean=df.groupby('Category').Value.transform(
        lambda x: x.rolling(3).mean()
    )
)

          Date Category  Value  Rolling_Mean
0   01.01.2017        A  12.30           NaN
1   02.01.2017        A  12.50           NaN
2   03.01.2017        A  12.90     12.566667
3   04.01.2017        A  13.10     12.833333
4   05.01.2017        A  12.90     12.966667
5   06.01.2017        A  13.55     13.183333
6   07.01.2017        A  13.12     13.190000
7   01.01.2017        B   1.14           NaN
8   02.01.2017        B   1.52           NaN
9   03.01.2017        B   1.74      1.466667
10  04.01.2017        B   2.12      1.793333
11  05.01.2017        B   1.75      1.870000
12  06.01.2017        B   1.69      1.853333
13  07.01.2017        B   1.35      1.596667

注意:

如果您希望此结果持续存在,请务必将其分配给变量

df = df.assign(
    Rolling_Mean=df.groupby('Category').Value.transform(
        lambda x: x.rolling(3).mean()
    )
)