2017-02-08 4 views
2

Hallo Ich möchte einen Zähler implementieren, der die Anzahl der aufeinanderfolgenden Null Beobachtungen in einem Datenrahmen (über mehrere Spalten) zählt. Aber ich möchte es zurücksetzen, wenn eine Nicht-Null-Beobachtung gefunden wird. Ich habe eine for-Schleife verwendet, aber es ist unglaublich langsam, ich bin mir sicher, dass es viel effizientere Wege geben muss. Dies ist mein Code:Implementieren Sie einen Zähler, der in Python Panda Datenrahmen zurückgesetzt

Hier ist eine Momentaufnahme von df

df.head() 

        ACL  ACT  ADH  ADR  AFE AFH  AFT 
2013-02-05  NaN  NaN  NaN  NaN  NaN NaN  NaN 
2013-02-12 -0.136861 -0.020406 0.046150 0.000000 -0.005321 NaN 0.058195 
2013-02-19 -0.006632 0.041665 0.007365 0.012738 0.040930 NaN -0.037818 
2013-02-26 -0.023848 -0.023999 -0.030677 -0.003144 0.050604 NaN -0.047604 
2013-03-05 0.009771 -0.024589 -0.021073 -0.039432 0.047315 NaN 0.068727 

ich zum ersten Mal einen leeren Datenrahmen initialisieren, die die gleichen Eigenschaften von df (Datenrahmen) über

df1=pd.DataFrame(index= df, columns=df) 
df1=df1.fillna(0) 

Dann schaffe ich meine Funktion, die über die Zeilen iteriert, aber nur eine Spalte gleichzeitig behandelt

Ich schätze jede Hilfe !!

Der Ausgang i erwarten ist wie folgt:

df1.tail() 
      BRN AXL TTO AGL ACL 
2017-01-03 3 125 0 0 0 
2017-01-10 0 126 0 0 0 
2017-01-17 1 127 0 0 0 
2017-01-24 0 128 0 0 0 
2017-01-31 0 129 1 0 0 
+0

Was ist Ihre erwartete Ausgabe? – Zero

+0

Hallo John, bitte sehen Sie die erste Frage, ich habe mit dem erwarteten Ergebnis aktualisiert, das ist ein Datenrahmen (DF1) mit dem Zähler-Ausgang – blala82

Antwort

0

Setup
Betrachten Sie die Datenrahmen df

df = pd.DataFrame(
    np.zeros((10, 2), dtype=int), 
    columns=list('AB') 
) 
df.loc[[0, 4, 8], 'A'] = 1 
df.loc[6, 'B'] = 1 
print(df) 

    A B 
0 1 0 
1 0 0 
2 0 0 
3 0 0 
4 1 0 
5 0 0 
6 0 1 
7 0 0 
8 1 0 
9 0 0 

Option 1
pandasapply

def zero_obs(x): 
    """`x` is assumed to be a `pd.Series`""" 
    csum = x.eq(0).cumsum() 
    cpos = csum.where(x.ne(0)).ffill().fillna(0) 
    return csum.sub(cpos) 

print(df.apply(zero_obs)) 

    A B 
0 0.0 1.0 
1 1.0 2.0 
2 2.0 3.0 
3 3.0 4.0 
4 0.0 5.0 
5 1.0 6.0 
6 2.0 0.0 
7 3.0 1.0 
8 0.0 2.0 
9 1.0 3.0 

Option 2
nicht verwenden apply

Diese Funktion auf df funktioniert genauso gut

zero_obs(df) 

    A B 
0 0.0 1.0 
1 1.0 2.0 
2 2.0 3.0 
3 3.0 4.0 
4 0.0 5.0 
5 1.0 6.0 
6 2.0 0.0 
7 3.0 1.0 
8 0.0 2.0 
9 1.0 3.0 
+0

Vielen Dank :) – blala82

+0

die Funktion ist ein bisschen problematisch, wenn die anfängliche Beobachtung ist nicht Null – blala82

+0

@ blala82 Ich beobachtete die gleiche Sache. Der Beitrag wurde bereits aktualisiert. Probieren Sie die Funktion, die ich jetzt habe. – piRSquared

Verwandte Themen