2017-01-12 5 views
0

Ich versuche, die Funktion unten auf einen Datenrahmen anzuwenden und nur die Zeilen, die qualifizieren, zurückgeben, aber einen KeyError erhalten. Was mache ich falsch?KeyError beim Ausführen von df durch Funktion

N = 100 

np.random.seed(0) 

df = pd.DataFrame(
    {'X':np.random.uniform(-3,10,N), 
    'Y':np.random.uniform(-3,10,N), 
    'Z':np.random.uniform(-3,10,N), 
    }) 

def func_sec(df): 
    for i in range(len(df)): 
     for k in range(i+1, len(df)+1): 
      df_sum = df[i:k].sum() 
      m = (df_sum>2).all() & (df_sum.sum()>10) 
      return df[m] 

func_sec(df) 
+0

Was soll 'm = (df_sum> 2) .all() & (df_sum.sum()> 10) tun? – doctorlove

+1

Hier ist 'm' ein boolescher Wert, und Ihr' df' hat keine booleschen Werte als Schlüssel, sondern 'X',' Y' und 'Z'. – IanS

+0

Ich möchte nur die Zeilen zurückgeben, die sich in einem Datenrahmen qualifizieren. Ich habe versucht, die for-Schleife in eine Funktion zu setzen, um mehrere df's gleichzeitig ausführen zu können. Kann es aber nicht zur Arbeit bringen – Zanshin

Antwort

1

Für einen Datenrahmen df können Sie nach Spalte z. 'X' in Ihrem Fall:

df['X'] 

oder in Scheiben schneiden einige Zeilen

df[0:10] 

Wenn Sie etwas versuchen ungültig wie df[0] oder df[True] Sie einen Schlüssel Fehler.

0

Wie andere bemerkt haben, wird der Schlüsselfehler wegen df [m] abgeworfen. Ihre Spaltennamen sind nicht boolesch, sie sind 'X', 'Y', 'Z'. Irgendwo am Ende von the pandas documentation gibt es einige Informationen zur booleschen Indexierung, also schlage ich vor, dass Sie es sich anschauen.

Lange Rede kurzer Sinn, können Sie df[True] nicht tun, aber Sie können tun df[df['X'] > 10] per se.

Verwandte Themen