Ich habe Daten in einem CSV mit einer Auflösung von 10 Minuten, as shown in this image Zeitstempel. Jeder Zeitstempel hat eine "ID", die entweder 1 oder 0 ist. Ich versuche eine neue Spalte zu erstellen, "time", die 0 zurückgibt, wenn "id" = 0 ist, andernfalls sollte sie den Wert von "time" im nächsten zurückgeben Zeile plus 10. Ich kann dies leicht auf Excel tun, und die Formel, die ich verwendet habe, wird im Bild gezeigt.Verwenden von Werten in der nächsten Zeile eines Datenrahmens
Ich versuche, Python zu verwenden, um das Gleiche zu tun. Nach dem Importieren der CSV-Daten als ein Datenrahmen mit Pandas, habe ich this link und this link betrachtet. Ich habe die Spalte "id" in eine neue Spalte "time" kopiert und den folgenden Code verwendet, aber die Werte von "time" bleiben genau gleich (1 oder 0).
for i, e in enumerate(df['time']):
if e==1:
df.at[i,'time']=df.at[i+1,'time']+10
Auf der Basis der Lösung in dem ersten Link, habe ich versucht, den Wert von ‚1‘ zu ändern if pd.isnull(e)
auf null und verwenden, aber am Ende TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
bekommen.
ich versuchte, wieder durch die Zeilen in umgekehrter Bestellung i+1
-i-1
ändern, aber es hat nicht funktioniert, und ich war immer KeyError: -1
.
Hat jemand irgendwelche Vorschläge, wie ich das in Python machen kann?
Edit:
Apologies, ich wahrscheinlich auch meine Frage nicht erklären. Ich habe herausgefunden, wie ich die Lösung bekommen kann, die ich wollte. Ich erkannte, dass das Problem aufgrund der dtypes für "id" und "time" beide object
war. Das KeyError: -1
Problem wurde gelöst, indem die Zeilen in umgekehrter Reihenfolge angeordnet wurden und in der allerersten Zeile ein Wert für "time" zugewiesen wurde, wenn es nicht 0 ist. Ich werde jede Zeile vor der ersten Zeile mit "id" ignorieren so verwendet, ich 999999.
Lösung:
#sort timestamp in reverse
df=df.sort_values(by="timestamp",ascending=False)
#change dtype object to int64
df['id']=df['id'].astype(np.int64)
df['time']=df['id']
#assigning value to "time" in first row
if df.loc[0,'time']==0:
df.set_value(0,'time',0)
else:
df.set_value(0,'time',999999)
#using the previous row's value to evaluate "time"
for i, e in enumerate(df['time']):
if e==1:
df.at[i,'time']=df.at[i-1,'time']+10
#sort timestamp back in ascending order
df=df.sort_values(by="timestamp")
Hallo Dmitry. Danke für den Vorschlag. Entschuldigung, ich glaube nicht, dass ich meine Frage gut erklärt habe und das war nicht genau das, wonach ich gesucht habe. Ihre Lösung hat mir jedoch geholfen, über meine Methode nachzudenken, und mir erlaubt, eine Lösung zu finden, die ich als Bearbeitung gepostet habe :) – nms