2016-07-26 9 views
4

Ich bin mir sicher, dass es eine sehr einfache Lösung für dieses Problem geben muss, aber ich finde es nicht (und beim Durchsuchen der zuvor gestellten Fragen habe ich die Antwort nicht gefunden oder nicht verstanden).Wie erhalten Sie Indizes von Werten in einem Pandas DataFrame?

Ich habe einen Datenrahmen ähnlich wie diese (nur viel größer, mit viel mehr Zeilen und Spalten):

 x val1 val2 val3 
0 0.0 10.0 NaN NaN 
1 0.5 10.5 NaN NaN 
2 1.0 11.0 NaN NaN 
3 1.5 11.5 NaN 11.60 
4 2.0 12.0 NaN 12.08 
5 2.5 12.5 12.2 12.56 
6 3.0 13.0 19.8 13.04 
7 3.5 13.5 13.3 13.52 
8 4.0 14.0 19.8 14.00 
9 4.5 14.5 14.4 14.48 
10 5.0 15.0 19.8 14.96 
11 5.5 15.5 15.5 15.44 
12 6.0 16.0 19.8 15.92 
13 6.5 16.5 16.6 16.40 
14 7.0 17.0 19.8 18.00 
15 7.5 17.5 17.7 NaN 
16 8.0 18.0 19.8 NaN 
17 8.5 18.5 18.8 NaN 
18 9.0 19.0 19.8 NaN 
19 9.5 19.5 19.9 NaN 
20 10.0 20.0 19.8 NaN 

Im nächsten Schritt, ich brauche die Ableitung dVal/dx für jeden der Wert zu berechnen, Spalten (in Wirklichkeit habe ich mehr als 3 Spalten, also muss ich eine robuste Lösung in einer Schleife haben, kann ich die Zeilen nicht jedes Mal manuell auswählen). Aber wegen der NaN-Werte in einigen Spalten stehe ich vor dem Problem, dass x und val nicht dieselbe Dimension haben. Ich denke, der Weg, dies zu überwinden, wäre, nur die x Intervalle zu wählen, für die das val notnull ist. Aber das kann ich nicht. Ich mache wahrscheinlich ein paar sehr dumme Fehler (ich bin kein Programmierer und ich bin sehr unbegabt, also bitte habe Geduld mit mir :)).

Hier ist der Code so weit (jetzt, da ich darüber nachdenke, habe ich vielleicht einige Fehler gemacht, indem ich einige alte Codeabschnitte zurückgelassen habe, weil ich seit einiger Zeit damit herumhantiere und verschiedene Dinge probiere):

import pandas as pd 
import numpy as np 

df = pd.read_csv('H:/DocumentsRedir/pokus/dataframe.csv', delimiter=',') 

vals = list(df.columns.values)[1:] 

for i in vals: 
    V = np.asarray(pd.notnull(df[i])) 

    mask = pd.notnull(df[i]) 
    X = np.asarray(df.loc[mask]['x']) 

    derivative=np.diff(V)/np.diff(X) 

Aber ich bin immer diese Fehlermeldung:

ValueError: operands could not be broadcast together with shapes (20,) (15,) 

Also, es scheint, sie wählen nicht nur die notnull Werte ...

gibt es einen offensichtlichen Fehler, dass ich ein m machen oder einen anderen Ansatz, den ich übernehmen sollte? Vielen Dank!

(Und noch weniger wichtige Frage: ist np.diff die richtige Funktion zu verwenden hier oder hatte ich es manuell besser berechnete durch endliche Differenzen ich sehr hilfreich numpy Dokumentation nicht finden?.)

Antwort

3

dVal Zur Berechnung/dX:

dVal = df.iloc[:, 1:].diff() # `x` is in column 0. 
dX = df['x'].diff() 
>>> dVal.apply(lambda series: series/dX) 

    val1 val2 val3 
0 NaN NaN NaN 
1  1 NaN NaN 
2  1 NaN NaN 
3  1 NaN NaN 
4  1 NaN 0.96 
5  1 NaN 0.96 
6  1 15.2 0.96 
7  1 -13.0 0.96 
8  1 13.0 0.96 
9  1 -10.8 0.96 
10  1 10.8 0.96 
11  1 -8.6 0.96 
12  1 8.6 0.96 
13  1 -6.4 0.96 
14  1 6.4 3.20 
15  1 -4.2 NaN 
16  1 4.2 NaN 
17  1 -2.0 NaN 
18  1 2.0 NaN 
19  1 0.2 NaN 
20  1 -0.2 NaN 

Wir Differenz alle Spalten (mit Ausnahme der ersten), und dann eine Lambda-Funktion auf jede Spalte anzuwenden, die X es durch die Differenz in Spalte aufteilt.

+0

Ok, jetzt habe ich ein anderes Problem erkannt. Ich muss vielleicht etwas glätten (sagen wir mal 2 m, vom ursprünglichen 0,5 m Abstand von x), die Werte der Ableitungen werden auf dieser Skala einfach verrückt. Ich habe die scipy Funktion filtfilt und butter gesehen, aber wahrscheinlich benutze ich sie nicht richtig ... Wie implementiert man sie in diesem Code? Vielen Dank. – durbachit

+0

Entschuldigung, aber Sie sollten nur eine Frage per Post stellen. Versuche, eine neue Frage zu stellen. Sie können auf diese Frage verweisen, wenn Sie möchten. – Alexander

+0

Ok, fertig, danke. – durbachit

Verwandte Themen