2016-08-01 9 views
2

Ich habe ein Datenframe mit mehreren Spalten und ein paar 1000 Zeilen mit Textdaten. Eine Spalte enthält Gleitkommazahlen, die die Zeit in aufsteigender Reihenfolge darstellen (0, 0.45, 0.87, 1.10 usw.). Von diesem möchte ich einen neuen Datenrahmen bauen, der nur alle Reihen enthält, in denen diese Zeitwerte zu den ganzen Zahlen am nächsten sind x = 0, 1, 2, 3 ...Zeilen in einem Datenframe zu einer Liste von Ganzzahlen zurückgeben

Hier auf Stackoverflow fand ich ein Antwort auf eine sehr ähnliche Frage, Antwort von DSM gepostet. Der Code ist im Wesentlichen das, modifiziert (hoffentlich), um die nächstliegende Zahl an x ​​zu geben, df ist mein Datenrahmen.

df.loc[(df.ElapsedTime-x).abs().argsort()[:1]] 

Dies scheint im Wesentlichen zu tun, was ich für einen x-Wert brauche, aber ich kann nicht herausfinden, wie diese -alle- Reihen zu extrahieren über den -entire- Datenrahmen zu durchlaufen, wo der Spaltenwert am nächsten ist, x = 0,1,2,3 .... in aufsteigender Reihenfolge. Dieser Code gibt mir einen Datenrahmen, es muss eine Möglichkeit geben, dies zu loopen und die resultierenden Datenrahmen anzuhängen, um das gewünschte Ergebnis zu erhalten.

Ich habe diese versucht:

L=[] 
for x in np.arange(len(df)): 
    L.append(df.loc[(df.ElapsedTime-x).abs().argsort()[:1]]) 
L 

L im Prinzip hat die richtigen Zeilen, aber es ist eine schmutzige Liste und es dauert eine lange Zeit, weil die Ausführung für Schleifen nicht eine gute Möglichkeit, eine iterieren Datenrahmen. Ich würde lieber einen Datenrahmen als Ergebnis erhalten.

Ich fühle, dass mir etwas Triviales fehlt.

Nicht sicher, wie man den gewünschten Datenrahmen bekannt gibt.

Lets sagen die timevalues ​​sind (aus meiner Datenrahmen genommen):

0.00,0.03,0.58,1.59,1.71,1.96,2.21,2.33,2.46,2.58,2.7,2.83,2.95,3.07 

Die Werte für 0,1,2,3 packte 0 wäre, 0,58, 1,96, 2,95

@beroe : Wenn die Zahlen 0,8, 1,1, 1,4, 2,8 sind, sollte in diesem Fall 1,1 für 1 und 1,4 für 2 genommen werden. Wenn als Beispiel die Zahlen 0,5 1,5 2,5 sind. Während ich denke, dass dies in meinen Daten unwahrscheinlich ist, denke ich, dass es in Ordnung wäre, 1,5 als 1 und 2,5 als 2 zu wählen. In dieser Anwendung halte ich das nicht für so kritisch, obwohl ich nicht sicher bin, wie ich es umsetzen würde Dies.

Bitte lassen Sie mich wissen, wenn jemand weitere Informationen benötigt.

+1

Bitte post ein Beispiel DataFrame und das gewünschte Ergebnis. – Alex

+0

Was möchten Sie tun, wenn zwei Werte nahe der gleichen Ganzzahl sind, aber keine nahe der nächsten Ganzzahl in der Zeile? z. B. "0,8, 1,1, 1,4, 2,8" - Wollen Sie, dass die 1,4 für 2 gegriffen wird, obwohl sie näher an 1 ist? Wird es jemals Werte geben, bei denen derselbe Wert zwei verschiedenen Ganzzahlen am nächsten kommt? – beroe

Antwort

1

Sie wissen nicht, wie schnell diese wäre, aber du könntest die Zeiten abrunden, um "reinzukommen" Teger“Kandidaten, nehmen Sie den absoluten Wert der Differenz selbst einen Weg zu geben, die am nächsten zu finden, dann sortiert nach Differenz und dann groupby die ganzzahligen Zeit nur die Zeilen zurück, die auf ganze Zahlen der Nähe ist:

# setting up my fake data 
df=pd.DataFrame() 
df['ElapsedTime']=pd.Series([0.5, 0.8, 1.1, 1.4, 1.8, 2.2, 3.1]) 

# To use your own data set, set df = Z, and start here... 
df['bintime'] = df.ElapsedTime.round() 
df['d'] = abs(df.ElapsedTime - df.bintime) 
dfindex = df.sort('d').groupby('bintime').first() 

Für die oben definierte falsche Zeitreihe lautet der Inhalt von dfindex:

  ElapsedTime d 
bintime     
0    0.5 0.5 
1    1.1 0.1 
2    1.8 0.2 
3    3.1 0.1 
+0

Beroe: Die ElapsedTime-Spalte in dindex ist genau die Zeiten, die ich extrahieren möchte. Was wäre der beste Weg, um jetzt die entsprechenden Spalten in meinem Z-Datenframe zu extrahieren? Ich wäre versucht, etwas nach dem Vorbild eines neuen Datenrahmens zu versuchen: Z ['ElapsedTime'] = dfindex ['ElapsedTime'], bin ich hier auf dem richtigen Weg? – Arne

+0

Tun Sie einfach den gleichen Prozess mit Ihrem Datenrahmen anstelle von 'df' und die Spalten sollten mit allem im' groupby' Schritt kommen. Oder sagen Sie zu Beginn "df = Z" und versuchen Sie es wie beschrieben. – beroe

+0

Entschuldigung, ich meinte, was ist der beste Weg, um die entsprechenden Zeilen, nicht Spalten zu extrahieren. – Arne

0

Betrachten Sie die folgende pd.Seriess

s = pd.Series(np.arange(5000), np.random.rand(5000) * 100).sort_index() 

s.head() 

0.002587 3007 
0.003418 4332 
0.060767 2045 
0.125182 3179 
0.134487 4614 
dtype: int64 

alle ganzen Zahlen Holen Sie am nächsten zu bekommen, um mit:

idx = (s.index // 1).unique() 

indizieren dann mit method='nearest'

s.reindex(idx, method='nearest').head() 

0.0 3912 
1.0 3617 
2.0 2574 
3.0  811 
4.0  932 
dtype: int64 
Verwandte Themen