2017-08-10 31 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() 
    ) 
) 
相關問題