2017-08-10 1 views
2

Ich möchte Rolling Mean Funktion im Datenrahmen anwenden. Ich habe mehr als eine Kategorie (A und B in der Spaltenkategorie) im Datenrahmen, daher muss ich den rollenden Mittelwert für jede Kategorie berechnen, und das ist mein Problem.Anwendung der Funktion in einer neuen Datenspaltenspalte basierend auf dem Wert einer anderen Spalte

Datenframe sieht wie folgt aus. Die Spalte Rolling_Mean ist das erwartete Ergebnis.

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 

berechnen Roll meine ich Pandas Roll verwenden:

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

aber ich bin nicht in der Lage Rollen für mehr als eine Kategorie bedeuten, zu berechnen.

Ich habe versucht, numpy.where (unten) zu verwenden, um dies zu berechnen, aber es funktioniert nur für eine Kategorie, und ich suche eine Lösung, die für 10 Kategorien funktioniert.

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

Antwort

2

Sie müssen groupby mit rolling, aber Ausgang ist Multiindex, so entfernen müssen erste Ebene von 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

Vielen Dank, es funktioniert! – bar1

+0

Froh kann helfen! Schöner Tag! – jezrael

1

Verwenden rolling innerhalb eines groupby Zusammenhang mit Category. Um den gleichen Index wie die aktuelle Datenrahmen zurückzukehren, verwenden Sie transform mit rolling eingebettet in einem 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 

Hinweis:

Wenn Sie das Ergebnis wollen weiterhin bestehen, stellen Sie sicher, es zu ordnen eine Variable

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