2016-10-03 2 views
2

Ich habe ein interessantes Problem, ich versuche, die Delta-Zeit zwischen Aufzeichnungen an verschiedenen Standorten durchgeführt zu berechnen.Berechnung Delta-Zeit zwischen Datensätzen im Datenrahmen

id x y time 
1 x1 y1 10 
1 x1 y1 12 
1 x2 y2 14 
2 x4 y4 8 
2 x5 y5 12 

Ich versuche, einige Sache zu bekommen wie

id x y time delta 
1 x1 y1 10 4 
1 x2 y2 14 0 
2 x4 y4 8 4 
2 x5 y5 12 0 

ich diese Art der Verarbeitung mit HiveQL getan haben durch individuelle UDTF verwenden, aber dachte, wie kann ich dies in der Regel mit Datenrahmen erreichen (es kann sei in R, Pandas, PySpark). Im Idealfall versuche ich eine Lösung für Python Pandas und Pyspark zu finden.

Jeder Hinweis wird geschätzt, danke für Ihre Zeit!

+0

Warum Reihe '1 x1 y1 12 'fehlt in der Ausgabe? – jezrael

+0

Benötigen Sie 'df.groupby (['id']) ['time']. Diff()'? – jezrael

+0

Hallo @jezrael Zeile 1 fehlt, weil dieser Datensatz wurde an der gleichen Stelle wie Zeile 0, ich versuche, die Delta-Zeit an verschiedenen Orten zu finden. Ich kann nur dann eine Gruppe erstellen, nachdem ich die mehreren Datensätze entfernt habe, die an jedem Standort erstellt wurden. Ich möchte immer den ersten Rekord an einem Ort machen. – suppoor

Antwort

1

Ich glaube, Sie brauchen drop_duplicates mit groupby mit DataFrameGroupBy.diff, shift und fillna:

df1 = df.drop_duplicates(subset=['id','x','y']).copy() 

df1['delta'] = df1.groupby(['id'])['time'].diff().shift(-1).fillna(0) 

Schlusscode:

import pandas as pd df = pd.read_csv("sampleInput.txt", 
             header=None, 
             usecols=[0,1,2,3], 
             names=['id','x','y','time'], 
             sep="\t") 

delta = df.groupby(['id','x','y']).first().reset_index() 
delta['delta'] = delta.groupby('id')['time'].diff().shift(-1).fillna(0) 

Timings:

In [111]: %timeit df.groupby(['id','x','y']).first().reset_index() 
100 loops, best of 3: 2.42 ms per loop 

In [112]: %timeit df.drop_duplicates(subset=['id','x','y']).copy() 
1000 loops, best of 3: 658 µs per loop 
+0

Ich denke schneller ist die Verwendung 'drop_duplicates', ich füge' copy' hinzu, wenn ein neuer 'DataFrame' erstellt werden muss. – jezrael

+0

Wenn meine Antwort hilfreich war, vergiss nicht [accept] (http://meta.stackexchange.com/a/5235/295067) es. Vielen Dank. – jezrael

+0

danke, ja es sieht schneller aus, bevor ich auftrat, ist dieser Code empfindlich auf ungeordnetes Zeitfeld, irgendwelche Ideen zum Ordnen in gruppierten Objekten (w.r.t Zeit)? und rufen Sie dann diff() für sortierte gruppierte Elemente auf. In jedem Fall muss ich groupby ID verwenden, nachdem ich Duplikate entfernt habe. – suppoor

0

@jezrael danke für die Hinweise, es war sehr nützlich, hier der Code

import pandas as pd 
df = pd.read_csv("sampleInput.txt", header=None,usecols=[0,1,2,3], names=['id','x','y','time'],sep="\t") 
delta = df.groupby(['id','x','y']).first().reset_index() 
delta['delta'] = delta.groupby('id')['time'].diff().shift(-1).fillna(0) 

Das

nimmt
1 x1 y1 10 
1 x1 y1 12 
1 x2 y2 14 
2 x4 y4 8 
2 x5 y5 12 

und gibt, ist

id x y time delta 
0 1 x1 y1 10  4 
1 1 x2 y2 14  0 
2 2 x4 y4  8  4 
3 2 x5 y5 12  0 
Verwandte Themen