2017-09-29 1 views
0

두 개의 열이있는 ProductIDBalance 데이터 프레임이 있습니다. 일부 Balance 열은 values =0 (df['Balance']=0)입니다. 내 dataframe 다른 제품을 포함python keyerror with dataframe loc 및 적용 λ

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 제품 ID를 기반으로 :

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

  2. 이 확인 제로 밸런스 행 :

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

  3. 나는 아래의 코드를 사용하고

  4. 적용 balance_average :

내가 파이썬 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 (값 = '잔액', 색인 = 'ProductID'), balance_average_dict = balance_average.to_dict(), df.loc [ '] = df.loc [zero_bool,'ProductID ']. 적용 (lambda x : balance_average_dict [x]) – mnr

0

당신 print (balance_average), 당신이 얻을 것이다 경우, 잘못 balance_average에 액세스하기 때문에 KeyError를가 얻는 이유는되지 않는

>>> 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]