2017-06-19 4 views
0

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") 

Antwort

0

Diese den Trick tun sollte, aber man hat nicht angegeben, wie Sie NaN Werte behandelt werden sollen, die in Ihrer Frage passieren wird

import pandas as pd 

df = pd.DataFrame({'id':[1,1,0,0,1,0,1], 'nums':[10,20,50,10,10,30,20]}) 


    id nums 
0 1 10 
1 1 20 
2 0 50 
3 0 10 
4 1 10 
5 0 30 
6 1 20 


df['nums'] = pd.concat([df, df['nums'].shift(-1)], axis=1).apply(lambda x: 0 if x['id'] == 0 else x[[2]]+10, axis=1) 

    id nums 
0 1 30.0 
1 1 60.0 
2 0 0.0 
3 0 0.0 
4 1 40.0 
5 0 0.0 
6 1 NaN 

Sie können einfach ein fillna(0) am Ende des Einzeilers hinzufügen, wenn Sie die Werte NaN ausfüllen möchten.

+0

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

Verwandte Themen