¿Cómo obtener índices de valores en un DataFrame de Pandas?

Estoy seguro de que debe haber una solución muy simple para este problema, pero no consigo encontrarlo (y al navegar por las preguntas anteriores, no encontré la respuesta que quería o no entendía).

Tengo un dataframe similar a este (mucho más grande, con muchas más filas y columnas):

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 

En el siguiente paso, debo calcular la derivada dVal / dx para cada una de las columnas de valor (en realidad tengo más de 3 columnas, así que necesito tener una solución robusta en un bucle, no puedo seleccionar las filas manualmente cada vez). Pero debido a los valores de NaN en algunas de las columnas, estoy enfrentando el problema de que x y val no son de la misma dimensión. Creo que la forma de superar esto sería seleccionar solo esos intervalos x, para los cuales el valor no es notnull . Pero no soy capaz de hacer eso. Probablemente estoy cometiendo algunos errores muy estúpidos (no soy un progtwigdor y no tengo muchos talentos, así que tenga paciencia conmigo :)).

Aquí está el código hasta ahora (ahora que lo pienso, puedo haber introducido algunos errores simplemente al dejar algunos códigos antiguos porque he estado jugando con él por un tiempo, intentando cosas diferentes):

 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) 

Pero estoy recibiendo este error:

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

Entonces, aparentemente, no seleccionó solo los valores no nulos …

¿Hay un error obvio que estoy cometiendo o un enfoque diferente que debería adoptar? ¡Gracias!

(Y otra pregunta menos importante: ¿es np.diff la función correcta para usar aquí o la calculé mejor de forma manual por diferencias finitas? No encuentro la documentación de números muy útil).

Para calcular dVal / 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 

Diferenciamos todas las columnas (excepto la primera), y luego aplicamos una función lambda a cada columna que la divide por la diferencia en la columna X