2016-06-10 11 views
2

Ich möchte meine Daten in einem Pandas Datenrahmen ändern.Änderung der Spaltenwerte nach Timedelta und Index

Die Daten, die ich sammle, müssen einen Schrittwert zugewiesen bekommen. Die Bedingungen, die einen Stufenwechsel auslösen, sind gelegentlich Zeit- oder Hochdruck- oder Temperaturwerte. Ich komme nicht über den ersten Schritt hinaus: Wenn die Reihe über einen bestimmten Druck (1100 psi) und unter einer Temperatur (40 C) steht, ist dies die "Verdünnungsphase".

Bei dem Versuch, den Wert zu ändern:

df.ix[(df['press'] > 1100) & (df['temp'] < 40),'proc'] = 'dilute'; 

Ich scheine nur die oberen zwei Reihen zu ändern.

items[0].head() 
Out[37]: 
       time  mass  temp  press  proc 
time                
00:00:00 10:58:07 21.947102 23.306101 1.830506  dilute 
00:00:01 10:58:08 22.076259 23.306101 57.274142  dilute 
00:00:02 10:58:09 22.094710 23.306101 196.000203 pressurize 
00:00:03 10:58:10 22.113161 23.306101 293.318991 pressurize 
00:00:03 10:58:10 22.094710 23.306101 361.161415 pressurize 

items[0].tail() 
Out[38]: 
       time  mass  temp  press  proc 
time               
00:36:12 11:34:19 18.201538 39.798763 -1.678585 pressurize 
00:36:13 11:34:20 18.183087 39.719165 -1.444645 pressurize 
00:36:14 11:34:21 18.183087 39.671407 -1.444645 pressurize 
00:36:15 11:34:22 18.219989 39.703246 -1.444645 pressurize 
00:36:16 11:34:23 18.201538 39.758964 -1.444645 pressurize 

Bei einer weiteren Untersuchung, die Indizierung zu funktionieren scheint, mir den Index geben, wo ich erwarten würde die Verdünnung sehen auftritt ...

print(df.ix[(df['press'] > 1100) & (df['temp'] < 40),'proc'].head(), 
       df.ix[(df['press'] > 1100) & (df['temp'] < 40),'proc'].tail()) 
time 
00:00:26 pressurize 
00:00:27 pressurize 
00:00:28 pressurize 
00:00:29 pressurize 
00:00:30 pressurize 
Name: proc, dtype: object time 
00:26:08 pressurize 
00:26:09 pressurize 
00:26:10 pressurize 
00:26:11 pressurize 
00:26:12 pressurize 
Name: proc, dtype: object 

jedoch, wenn es um meine Daten anzuwenden, ich bekomme nur die ersten beiden Werte geändert, und die message--

FutureWarning: in Zukunft wird boolean-Array-likes als ein boolean-Array-Index-Werte [Indexer] = value‘behandelt werden

Das Ausführen der cookbook examples gibt die erwartete Antwort.

Es scheint, dass ich einen verschachtelten Index habe, aber ich bin nicht klar, warum, oder wie man dies ändern soll. Hier gibt es ein paar Ebenen, und die Suche nach Lösungen hat sich nicht als nützlich erwiesen oder lieferte den besten Weg zur Klärung.

Ich dachte, um den Index zurückzusetzen, und gehen Sie mit Zahlen, aber ich muss Schritte nach Werten und Zeitdelta sortieren.

Der Index ist ein Timedelta, das ich benötigte, um eine Anzahl von Läufen zu normalisieren, die über eine Anzahl von Perioden gestartet wurden, um alle Läufe zur gleichen Zeit 0 Sekunden zu starten. Meine Suchen ergeben nur das Datum Munging und nicht die Zeit, daher meine Normalisierungswerte auf Null mit einem Timedelta-Index.

Wenn es eine bessere Möglichkeit gibt, diese Frage oder mehr Klarheit zu veröffentlichen, fragen Sie bitte. Ich bin mehr als bereit, Klarheit oder Ordnung hinzuzufügen. Es ist schwer vorherzusagen, wie die hilfreiche Information für einen professionellen Programmierer aussehen würde.

+1

ich die Spalte auf die Timedelta und „normalisiert“ geändert basierend auf dem minimalen Wert der Zeit. Das hat den Index mit der Zeit verglichen, also ist das vielleicht das Problem. – double0darbo

+0

Es gibt über 2000 Datenpunkte. Seien Sie versichert, dass es tut, und beachten Sie, wie die ersten zwei Zeilen verdünnen zeigen. Irgendwelche Gedanken dazu? Ich werde in das Umbenennen der Zeitspalte schauen und sehen, ob das den Trick macht – double0darbo

+0

Sie tun nicht, und das war, was so frustrierend war. Der Index ist zwei Spalten, eine Zeit und der Proc, also dachte ich, es hatte etwas damit zu tun, einen n-Wert von zwei – double0darbo

Antwort

4

Versuchen Sie, diese

df['press'].astype('float') 
df['temp'].astype('float') 

df['proc'] = np.where((df['press'] > 1100) & (df['temp'] < 40),'dilute', "pressurized") 
+0

Das hat funktioniert. Irgendeine Vermutung, warum der andere nicht? Ich frage, weil ich ungefähr 7 von diesen tun muss, und es verliert seine pythonification – double0darbo

+0

Addieren Sie zu Frage, ich werde einen Blick haben. – Merlin

+0

Das ist viel Info eine Frage, bitte stellen Sie eine zweite Frage – Merlin

1

Verwendung .loc statt .ix

df.loc[(df.press > 1100) & (df.temp < 40), 'proc'] = 'dilute' 
+0

Ich gab diesem einen Schuss, aber die gleiche Antwort. – double0darbo

+0

versuchen Merlins Antwort. Gleiche Sache? – piRSquared

+0

Sie sehen oben, dass die Verwendung eines ähnlichen Ansatzes mit den Indexwerten funktioniert, aber aus irgendeinem Grund spuckt mich das wieder in den gleichen Fehler. – double0darbo

Verwandte Themen