2017-05-24 6 views
1

Ich habe einen Datenrahmen der folgenden Struktur, die für die Zwecke dieser Frage vereinfacht:Datenrahmen binned mittelt, überspringen nan

Date  A B 
2016/1/1 nan nan 
2016/1/2 nan nan 
2016/1/3 3 2 
2016/1/4 4 1 
2016/1/5 nan nan 
2016/1/6 6 8 
2016/1/7 7 nan 
2016/1/8 8 3 
2016/1/9 9 5 

Was wünsche ich eine 3-tägige binned Durchschnitt erstellen zu tun, kann ich leicht tun dies mit

df = df.resample('3D', on='Date').mean() 

jedoch mit dieser Methode die nan Werte als Null-Werte gezählt und sie beeinflussen den Mittelwert etwa so:

Date  A B 
2016/1/1 nan nan 
2016/1/2 nan nan 
2016/1/3 3 2 

Mit df.resample('3D', on='Date').mean() kehrt:

Date  A B 
2016/1/3 1 2/3 

Wo, wie ich will erhalten:

Date  A B 
2016/1/3 3 2 

Wenn die Werte für die Berechnung ignoriert werden na.

Gemäß der Dokumentation auf .mean() Ich sollte Werte der Lage sein, skipna wie auf der Seite aufgelistet:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.mean.html#pandas.Series.mean

Allerdings, wenn ich folgendes ausgeführt:

df = df.resample('3D', on='Date').mean(skipna=True) 

Die Folgendes wird zurückgegeben:

UnsupportedFunctionCall: numpy operations are not valid with resample. Use .resample(...).mean() instead 

Wie gehe ich über solv diesen Fehler und die richtigen Mittelwerte, die ich begehre?

+0

Ich denke, es gibt ein Problem, weil für 'df1 = df.resample ('3D', ein = 'Datum') mean()' I hole 'df1 = pd.DataFrame ({' A ': [3.0, 5.0, 8.0],' B ': [2.0 , 4.5, 4.0]}, index = pd.to_datetime (['2016-01-01', '2016-01-04', '2016-01-07'])) ' – jezrael

+0

Also sind alle 'NaN' Werte von der Anzahl der Mittelwerte ausgeschlossen. – jezrael

+0

Ja, das ist richtig, die Anzahl der Mittelwerte wird durch die NaN-Werte beeinflusst, daher ist es das, wonach ich suche. 'Cumsum' und' Cummcount' sind etwas, das funktioniert, aber ich bin mir nicht sicher, wie ich es mit Resample in der einzigen Zeile implementieren kann. – cd123

Antwort

0

Sie benötigen:

#mean works perfectly 
df1 = df.resample('3D', on='Date').mean() 
print (df1) 
       A B 
Date     
2016-01-01 3.0 2.0 
2016-01-04 5.0 4.5 
2016-01-07 8.0 4.0 

Für cumsum und cumcount mit Weglassung NaN Bedürfnis transform, auch für cumcount verwendet wird Trick Zahl 1 s:

df[['A1','B1']] = df.resample('3D', on='Date').transform('cumsum') 

df[['A2','B2']] = df[['A','B']].mask(df[['A','B']].notnull(), 1) 
df[['A2','B2']] = df.resample('3D', on='Date')[['A2','B2']].transform('cumsum') - 1 
print (df) 
     Date A B A1 B1 A2 B2 
0 2016-01-01 NaN NaN NaN NaN NaN NaN 
1 2016-01-02 NaN NaN NaN NaN NaN NaN 
2 2016-01-03 3.0 2.0 3.0 2.0 0.0 0.0 
3 2016-01-04 4.0 1.0 4.0 1.0 0.0 0.0 
4 2016-01-05 NaN NaN NaN NaN NaN NaN 
5 2016-01-06 6.0 8.0 10.0 9.0 1.0 1.0 
6 2016-01-07 7.0 NaN 7.0 NaN 0.0 NaN 
7 2016-01-08 8.0 3.0 15.0 3.0 1.0 0.0 
8 2016-01-09 9.0 5.0 24.0 8.0 2.0 1.0 
+0

Vielen Dank dafür, nach dem Lesen Ihrer Antwort habe ich etwas mit dem Originaldatensatz überprüft, den ich gerade eingelesen habe, und die Datenrahmenoperationen wurden auf dem falschen Datenrahmen ausgeführt. Das wurde korrigiert, danke für die Einsicht. – cd123

+0

Kein Problem, 'cumsum' und' cumcount' war kein einfaches Werkzeug;) Viel Glück! – jezrael

Verwandte Themen