2017-09-29 1 views
0

Ich habe einen Datenrahmen mit zwei Spalten ProductID und Balance. Einige Balance Spalten haben values =0 (df['Balance']=0). Mein Datenrahmen enthält verschiedene Produkte:Python Keyerror mit Datenframe loc und gelten Lambda

Index ProductID Balance 

1  10  100 

**2  20  0** 

3  30  200 

**4  20  150 

5  20  240** 

6  40  100 

7  30  200 

ich den Nullabgleich bei Index 2 mit einem durchschnittlichen Guthaben auf den product ID=20 ((0 +150 + 240)/3 =130) basierend zurechnen will.

Ich bin mit dem folgenden Code:

  1. Zuerst bekommen die balance_average basierend auf dem ProductID:

    balance_average = df.pivot_table(values='Balance', index='ProductID')

  2. Identifizierung der Nullabgleich Reihen:

    zero_bool = (df['Balance'] == 0)

  3. Anwendung balance_average:

    df.loc[zero_bool, 'Balance'] = df.loc[zero_bool, 'ProductID'].apply(lambda x: balance_average[x])

Wenn ich den Code oben in Python ausführen 3.6 Ich bin KeyError: '20' bekommen. 20 ist die entsprechende ProductID der ersten Nullbilanzsäule. Kann mir jemand sagen, was mit dem obigen Code nicht stimmt?

Antwort

0

Ich denke, der Fehler liegt daran, dass Sie 'balance_average' wie ein Wörterbuch innerhalb Ihres Anwendungscodes lesen (was Sie tun müssen - konvertieren Sie balance_average in ein dict).

Können Sie versuchen ?:

balance_average = df.pivot_table(values='Balance', index='ProductID') 
bal_avg_dct = balance_average.to_dict() 
.... 
df.loc[zero_bool, 'Balance'] = df.loc[zero_bool, 'ProductID'].apply(lambda x: balance_average[x]) 
+0

versucht, den Code unten, noch KeyError bekommen: 20. zero_bool = (df ['Balance'] == 0) balance_average = df.pivot_table (Werte = 'Balance', index = 'ProductID'), balance_average_dict = balance_average.to_dict(), df.loc [zero_bool, 'Balance '] = df.loc [zero_bool,' ProductID ']. apply (Lambda x: balance_average_dict [x]) – mnr

0

Der Grund, warum Sie ein KeyError bekommen ist, weil Sie die balance_average falsch zugreifen, wenn Sie print (balance_average), erhalten Sie dieses:

>>> print (balance_average) 
      Balance 
ProductID   
10    100 
20    130 
30    200 
40    100 

Was nicht ist der Skalar, den Sie wollen. Sie können den Wert wie folgt zugreifen:

>>> print (balance_average['Balance'][20]) 
130 

Ihre Lambda-Funktion sollte also sein:

lambda x: balance_average['Balance'].[x]