2017-08-10 85 views
2

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

数据框如下所示。 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 

计算滚动平均值我用熊猫滚动:

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

您需要groupbyrolling,但产量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

谢谢,它的工作原理! – bar1

+0

很高兴能帮到你!美好的一天! – jezrael

1

使用rolling一个groupby范围内与Category。要返回相同的索引作为当前数据帧中,使用transformrolling嵌入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() 
    ) 
) 
相关问题