Pandas按Symbol分组比较连续Q-Y/Y Eps生成增长布尔列报错如何解决
报错原因解析
代码1报错原因
你在lambda匿名函数中直接对两个Series对象(x.shift(-2)和x.shift(-1)的返回结果)做if条件判断,Pandas无法判定你是要判断序列所有元素满足条件、还是任意元素满足条件,因此抛出「The truth value of a Series is ambiguous」错误。此外你在if分支直接返回单个True/False字符串,也不符合apply要求返回与分组长度一致序列的规则。
代码2报错原因
groupby.transform()需要接收可调用的函数作为参数,但你直接传入了np.where的执行结果(numpy数组),Pandas会把这个数组当做分组键尝试哈希处理,numpy数组本身不可哈希,因此抛出「unhashable type: 'numpy.ndarray'」错误。
正确实现方案
首先确认你的数据排列顺序:
- 如果你的数据按
Date升序排列(更早的日期在分组的顶部/df的头部),先执行排序保证顺序正确:
df = df.sort_values(by=['Symbol', 'Date'], ascending=[True, True]).reset_index(drop=True)
- 如果你数据本身就是按
Date降序排列(更早的日期在分组的底部/df的尾部,符合你说的「从每组底部向上比较」的默认顺序),可以跳过排序步骤。
之后执行对应比较逻辑即可:
# 升序排列用这个:当前行比上一行(更早的行)EPS高返回True df['Increase Eps Growth'] = df.groupby('Symbol')['Q - Y/Y Eps'].apply(lambda x: x > x.shift(1)) # 降序排列用这个:当前行比下一行(更早的底部行)EPS高返回True # df['Increase Eps Growth'] = df.groupby('Symbol')['Q - Y/Y Eps'].apply(lambda x: x > x.shift(-1))
生成的列直接是布尔类型的True/False,符合你的存储要求。如果需要字符串格式的结果,可以在比较后加.astype(str)转换。
内容的提问来源于stack exchange,提问作者Merrickk
相关产品推荐
相关产品推荐

