繁体   English   中英

python keyerror与数据帧查找并应用lambda

[英]python keyerror with dataframe loc and apply 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

我想根据product ID=20 ((0 +150 + 240)/3 =130)在索引2处归零平均余额。

我正在使用以下代码:

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

当我在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM