使用dataframe loc并应用lambda的python keyerror

时间:2017-09-29 14:28:08

标签: python lambda

我的数据框有两列ProductIDBalance。 有些Balance列有values =0 (df['Balance']=0)。 我的数据框包含不同的产品:

Index ProductID Balance

1        10     100

**2      20     0**

3        30     200

**4      20     150

5        20     240**

6        40     100

7        30     200

我想将索引2的零余额归为基于product ID=20 ((0 +150 + 240)/3 =130)的平均余额。

我使用以下代码:

  1. 首先根据ProductID获取balance_average

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

  2. 识别零余额行:

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

  3. 应用balance_average:

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

  4. 当我在python 3.6中执行上面的代码时,我得到了 KeyError: '20'。 20是第一个零余额列的对应ProductID。 有人能告诉我上面的代码有什么问题吗?

2 个答案:

答案 0 :(得分:0)

我认为错误是因为您正在阅读“balance_average'就像你的应用代码中的字典(这是你需要做的 - 将balance_average转换成字典)。

你能试试吗?:

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

答案 1 :(得分:0)

你得到KeyError的原因是因为你错误地访问了balance_average,如果你print (balance_average),你会得到这个:

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

这不是你想要的标量。您可以像这样访问值:

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

所以你的lambda函数应该是:

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