Pandas按条件映射惩罚值时触发ValueError的解决求助
解决Pandas条件索引映射赋值的ValueError问题
错误原因
报错的核心是赋值两边元素数量不匹配:df.index.map(df_group_by_purchase["purchase penalty"])会生成和整个DataFrame行数一致的数组(2714个值),但你仅需要给month number == 8的1378行赋值,直接赋值时两边长度不匹配,因此触发ValueError。
解决方案
以下两种方法都能实现你的需求:
方法一:仅对符合条件的行做映射赋值
先筛选出month number == 8的行,再针对这些行的索引映射惩罚值,最后完成赋值:
# 获取符合条件的行对应的惩罚值 target_penalties = df.loc[df["month number"] == 8].index.map(df_group_by_purchase["purchase penalty"]) # 赋值给指定位置 df.loc[df["month number"] == 8, "purchase penalty"] = target_penalties
方法二:先全局映射再清理不符合条件的行
先给所有行映射惩罚值,再将month number != 8的行的惩罚值设为你需要的默认值(比如NaN):
import numpy as np # 给所有行映射惩罚值 df["purchase penalty"] = df.index.map(df_group_by_purchase["purchase penalty"]) # 清除不符合条件的行的惩罚值 df.loc[df["month number"] != 8, "purchase penalty"] = np.nan
代码优化建议
你可以用lambda函数替代自定义的calculate_under_60_purchase,让代码更简洁:
df_group_by_purchase["purchase penalty"] = df_group_by_purchase["میانگین خرید دو ماه"].apply(lambda x: 12000 if x <= 60 else 0)
内容的提问来源于stack exchange,提问作者user17713444
相关产品推荐
相关产品推荐

