2017-09-29 2 views
0

私は2つの列がProductIDBalanceのデータフレームを持っています。 一部のBalanceの列はvalues =0 (df['Balance']=0)です。 私のデータフレームは、異なる製品が含まれていますデータフレームのあるpython keyerrorとラムダを適用

Index ProductID Balance 

1  10  100 

**2  20  0** 

3  30  200 

**4  20  150 

5  20  240** 

6  40  100 

7  30  200 

私はproduct ID=20 ((0 +150 + 240)/3 =130)に基づく平均残高を指標2でゼロバランスを転嫁したいです。

  1. まず取得balance_average商品コードに基づいて:

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

  2. が識別ゼロバランス行:

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

  3. 私は以下のコードを使用しています

  4. 適用balance_average:

私は、Python 3.6で、私は KeyError: '20'を取得しています上記のコードを実行

df.loc[zero_bool, 'Balance'] = df.loc[zero_bool, 'ProductID'].apply(lambda x: balance_average[x])。 20は、最初のゼロバランス列の対応するProductIDです。 誰かが上記のコードに何が問題なのか教えてもらえますか?

答えて

0

私はあなたのアプリケーションコード内の辞書のような 'balance_average'を読んでいるからです(これはあなたがする必要があるものです - balance_averageからdictに変換する)。

はあなたが

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

はまだKeyError例外を取得し、以下のコードを試してみました。 zero_bool =(df ['Balance'] == 0) balance_average = df.pivot_table(値= '残高'、index = 'ProductID')、balance_average_dict = balance_average.to_dict()、 df.loc [zero_bool、 '残高'] = df.loc [zero_bool、' ProductID ']。apply(lambda x:balance_average_dict [x]) – mnr

0

?:試すことができますあなたが誤ってbalance_averageにアクセスしているので、あなたがKeyError例外を取得する理由は、あなたprint (balance_average)場合、あなたはこの取得します:

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

をされていませんあなたが望むスカラー。あなたはこのような値にアクセスすることができます。

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

だからあなたのラムダ関数は次のようになります。20:

lambda x: balance_average['Balance'].[x] 
関連する問題