2017-05-30 3 views
0

Angenommen, ich eine Datenrahmen haben, wie folgt,Looping durch vorherigen oder nächsten Zeilen und tun Berechnung - Python

ID response time 
1 1315  1.434054 
2 1682  3.753334 
2 2829  5.940094 
3 184  6.243214 
4 243  6.301918 
3 1413  7.486633 
5 2400 11.474644 
6 2151  3.288531 

der Datenrahmen hat eine ID, Antwort und Zeit.

Für Beispiele, die keine Duplikate in ID (1,4,5,6) haben, möchte ich die Zeit zurückgeben. Für Beispiele, die Duplikate in ID (2,3) haben, möchte ich das Minimum der zwei Zeiten in der Spalte min_time und den Unterschied zwischen den beiden Zeiten in der Differenzspalte zurückgeben. Im Folgenden ist der Ausgang ich bin auf der Suche,

ID  response time  min_time  difference 
    1   1315  1.434054 1.434054  NA 
    2   1682  3.753334 3.753334  2.18676 
    2   2829  5.940094 3.753334  2.18676 
    3   184  6.243214 6.243214  1.243419 
    4   243  6.301918 6.301918   NA 
    3   1413  7.486633 6.243214  1.243419 
    5   2400 11.474644 11.474644  NA 
    6   2151  3.288531 3.288531   NA 

Während ich in der Lage bin diese Ausgabe zu bringen Schleifen verwendet wird, ist es nicht die beste effiziente Art und Weise, es zu tun, und es dauert auch viel Zeit. Gibt es einen besseren Weg, dies zu tun?

+0

Vielleicht kann dies helfen: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html – moooeeeep

Antwort

0

Hier ist eine hässliche Art und Weise, ein Wörterbuch der Mindestzeiten für jede ID zu erstellen. Du hast deine Lösung für dieses Problem nicht zur Verfügung gestellt, daher fällt es mir schwer, das mit dem zu vergleichen, was du gemacht hast, aber das läuft nicht zu langsam.

data = {} 

with open(path) as File: 
    for line in File: 
     ID, response, time = line.split() 
     if ID in data: 
      data[ID].append([response, time]) 
     else: 
      data.update({ID: [[response, time]]}) 

minTimes = {} 
for ID, value in data.items(): 
    if len(value) > 1: 
     for i, j in enumerate(value): 
      if ID in minTimes: 
       if value[i][1] < minTimes[ID]: 
        minTimes[ID] = value[i][1] 
      else: 
       minTimes[ID] = value[i][1] 
    else: 
     minTimes[ID] = 'NA' 

for ID, value in data.items(): 
    for i, j in enumerate(value): 
     if minTimes[ID] != 'NA': 
      value[i] = [ 
          int(value[i][0]), 
          float(value[i][1]), 
          float(minTimes[ID]), 
          abs(float(value[i][1]) - float(minTimes[ID])) 
         ] 
     else: 
      value[i] = [ 
          int(value[i][0]), 
          float(value[i][1]), 
          float(value[i][1]), 
          minTimes[ID] 
         ] 

print(data) 

Ich überlasse es Ihnen, um die Ausgabe zu formatieren. Während ich damit gearbeitet habe, habe ich nur json.dumps benutzt, um es gut zu drucken, aber wenn du willst, dass es im selben Format ist wie in deiner Frage, musst du das selbst machen.

+0

Dies ist nicht gerade eine speicheroptimale Lösung, aber es wird funktionieren. Wenn Sie mit größeren Datensätzen arbeiten, denken Sie an die Idee, dass Sie nicht jedes Mal auf dem Weg speichern müssen, nur die kürzeste Zeit für jede ID, wenn Sie zwei Durchgänge durch die Daten nicht stören. Eins zum Sammeln von Min., Eins zum Ausgeben. – billjamesdev

0

Sie können dies versuchen:

df['min_time'] = df.groupby('ID')['time'].transform(lambda x: x.min()) 

df['difference'] = df.groupby('ID')['time'].transform(lambda x: x.max()-x.min()).replace(0,np.nan) 

print(df) 

Ausgang:

ID response  time min_time difference 
0 1  1315 1.434054 1.434054   NaN 
1 2  1682 3.753334 3.753334 2.186760 
2 2  2829 5.940094 3.753334 2.186760 
3 3  184 6.243214 6.243214 1.243419 
4 4  243 6.301918 6.301918   NaN 
5 3  1413 7.486633 6.243214 1.243419 
6 5  2400 11.474644 11.474644   NaN 
7 6  2151 3.288531 3.288531   NaN 
0

Ist das, was Sie brauchen? auch neben diesem können Sie auch transform versuchen in Pandas

funcs = dict(min_time ='min', difference=np.ptp) 
d1 = df.join(df.groupby(['ID']).time.agg(funcs), on=['ID']) 
d1.loc[d1.difference==0]=np.nan 

Out[27]: 
    ID respon  time min_time difference 
0 1.0 1315.0 1.434054 1.434054   NaN 
1 2.0 1682.0 3.753334 3.753334 2.186760 
2 2.0 2829.0 5.940094 3.753334 2.186760 
3 3.0 184.0 6.243214 6.243214 1.243419 
4 4.0 243.0 6.301918 6.301918   NaN 
5 3.0 1413.0 7.486633 6.243214 1.243419 
6 5.0 2400.0 11.474644 11.474644   NaN 
7 6.0 2151.0 3.288531 3.288531   NaN 
Verwandte Themen