我的数据框有两列ProductID
和Balance
。
有些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)
的平均余额。
我使用以下代码:
首先根据ProductID获取balance_average
:
balance_average = df.pivot_table(values='Balance', index='ProductID')
识别零余额行:
zero_bool = (df['Balance'] == 0)
应用balance_average:
df.loc[zero_bool, 'Balance'] = df.loc[zero_bool, 'ProductID'].apply(lambda x: balance_average[x])
当我在python 3.6中执行上面的代码时,我得到了
KeyError: '20'
。
20是第一个零余额列的对应ProductID。
有人能告诉我上面的代码有什么问题吗?
答案 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]