[英]python keyerror with dataframe loc and apply lambda
我有一个包含两列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
我想根据product ID=20 ((0 +150 + 240)/3 =130)
在索引2处归零平均余额。
我正在使用以下代码:
首先根据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'
。 第一个零余额列的对应ProductID为20。 有人可以告诉我上述代码有什么问题吗?
我认为错误是因为您在应用代码中正在像字典一样阅读“ 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])
出现balance_average
的原因是因为您错误地访问了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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.