2016-07-04 3 views
0

Ich habe Probleme damit, so dass jeder Eingang geschätzt wird. Ich möchte über die Werte in einer Datenrahmenspalte iterieren und die erste Instanz zurückgeben, wenn ein Wert jeden Tag angezeigt wird. Groupby sah dafür eine gute Option aus, aber wenn df.groupby(grouper).first() mit grouper täglich verwendet wird, wird die folgende Ausgabe angezeigt.Pandas: Finden Sie das erste Vorkommen - auf täglicher Basis in einer Zeitreihe

In [95]: 
df.groupby(grouper).first() 

Out[95]: 
      test_1 
2014-03-04  1.0 
2014-03-05  1.0 

Dies ist nur der Tag der Wert geben in Test gesehen wurde _1 und nicht Reseting die erste() auf einer täglichen Basis, das ist das, was ich brauche (gewünschte Ausgangs siehe unten).

Ich möchte die Zeit bewahren dieser Wert im folgenden Format zu sehen war:

Dies ist der Eingang Datenrahmen:

    test_1 
2014-03-04 09:00:00 NaN 
2014-03-04 10:00:00 NaN 
2014-03-04 11:00:00 NaN 
2014-03-04 12:00:00 NaN 
2014-03-04 13:00:00 NaN 
2014-03-04 14:00:00 1.0 
2014-03-04 15:00:00 NaN 
2014-03-04 16:00:00 1.0 
2014-03-05 09:00:00 1.0 

Dies ist die gewünschte Ausgabe:

    test_1 test_output 
2014-03-04 09:00:00 NaN NaN 
2014-03-04 10:00:00 NaN NaN 
2014-03-04 11:00:00 NaN NaN 
2014-03-04 12:00:00 NaN NaN 
2014-03-04 13:00:00 NaN NaN 
2014-03-04 14:00:00 1.0 1.0 
2014-03-04 15:00:00 NaN NaN 
2014-03-04 16:00:00 1.0 NaN 
2014-03-05 09:00:00 1.0 NaN 

I Ich möchte nur den Zeitpunkt angeben, an dem ein Ereignis in einer neuen Spalte mit dem Namen test_output auftritt.

Administratoren. Bitte beachten Sie, dass sich diese Frage von den anderen als Duplikat unterscheidet, da dies ein Rolling des ersten Tages erfordert.

+0

Mögliches Duplikat [Ignore np.where nach dem ersten Spiel für Pandas Zeitreihendaten] (http://stackoverflow.com/questions/38183182/ignore-np-where-after-first-match-for-pandas-time-series-data) – shivsn

Antwort

0

dieses Versuchen, diese Daten verwenden:

rng = pd.DataFrame({'test_1': [None, None,None, None, 1,1, 1 , None, None, None,1 , None, None, None,]}, index = pd.date_range('4/2/2014', periods=14, freq='BH')) 
rng 

        test_1 
2014-04-02 09:00:00  NaN 
2014-04-02 10:00:00  NaN 
2014-04-02 11:00:00  NaN 
2014-04-02 12:00:00  NaN 
2014-04-02 13:00:00  1.0 
2014-04-02 14:00:00  1.0 
2014-04-02 15:00:00  1.0 
2014-04-02 16:00:00  NaN 
2014-04-03 09:00:00  NaN 
2014-04-03 10:00:00  NaN 
2014-04-03 11:00:00  1.0 
2014-04-03 12:00:00  NaN 
2014-04-03 13:00:00  NaN 
2014-04-03 14:00:00  NaN 

Der Ausgang ist dies:

rng['test_output'] = rng['test_1'].loc[rng.groupby(pd.TimeGrouper(freq='D'))['test_1'].idxmin()] 

        test_1 test_output 
2014-04-02 09:00:00  NaN   NaN 
2014-04-02 10:00:00  NaN   NaN 
2014-04-02 11:00:00  NaN   NaN 
2014-04-02 12:00:00  NaN   NaN 
2014-04-02 13:00:00  1.0   1.0 
2014-04-02 14:00:00  1.0   NaN 
2014-04-02 15:00:00  1.0   NaN 
2014-04-02 16:00:00  NaN   NaN 
2014-04-03 09:00:00  NaN   NaN 
2014-04-03 10:00:00  NaN   NaN 
2014-04-03 11:00:00  1.0   1.0 
2014-04-03 12:00:00  NaN   NaN 
2014-04-03 13:00:00  NaN   NaN 
2014-04-03 14:00:00  NaN   NaN 
+0

Danke Merlin die Hilfe zu schätzen wissen. Ich habe Ihr Rng DF versucht und es funktioniert mit den Testdaten, die Sie generiert haben. Leider bekomme ich einen Fehler, wenn ich das mit meinem Datenframe versuche: Ich habe 'data ['test_output'] = data ['Gap Higher Closed'] verwendet. Loc [data.groupby (pd.TimeGroup (freq = 'D')) [ "Gap Higher Closed"]. Idxmin()] ' Dies ist der Fehler https://dl.dropboxusercontent.com/u/32282382/error.txt – ade1e

+0

Dies ist der eigentliche Datenrahmen Im versuchen, dies zu verwenden. 'data ['Gap Higher Closed']. value_counts() Aus [17]: 1.0 1755 Name: Gap Higher Closed, dtype: int64' – ade1e

+0

Wenn der obige Code funktioniert. Markieren Sie es als richtig - Sie sollten eine andere Frage mit einem echten Teil Ihrer Daten stellen .. fügen Sie Ihren echten und echten Fehler zu einer neuen Frage hinzu - Code über Arbeit für die Daten, die Sie in Ihrer Frage zur Verfügung gestellt haben. – Merlin

Verwandte Themen