Pandas Groupby与Lambda报错:缺少必要位置参数'y'的解决求助
问题:按Symbol分组生成'Lower Low'列时报错的修复方法
我有一个包含不同Symbol及其对应价格的mod_df数据框,原代码可正常生成'Lower Low'列:
mod_df['Lower Low'] = np.where((mod_df['Helper_L'] != mod_df['Helper_L'].shift(-1)) & (mod_df['Price'] < mod_df['Price'].shift(1)) & (mod_df['Price'] < mod_df['Price'].shift(-1)), 'Lower Low', '')
但当尝试按'Symbol'分组并使用Lambda函数执行如下代码时,出现错误:TypeError: mod..() missing 1 required positional argument: 'y'
mod_df['Lower Low'] = mod_df.groupby('Symbol')[['Helper_L', 'Price']].transform(lambda x, y: (np.where((x != x.shift(-1)) & (y < y.shift(1)) & (y < y.shift(-1)), 'Lower Low', '')))
修复方法
报错原因是:当通过groupby传入多列列表时,transform会将每个分组的完整子DataFrame传递给lambda,而非将列拆分为单独的x、y参数。以下是两种可行的修复方式:
方式1:在lambda中直接访问子DataFrame的列
mod_df['Lower Low'] = mod_df.groupby('Symbol').transform( lambda df: np.where( (df['Helper_L'] != df['Helper_L'].shift(-1)) & (df['Price'] < df['Price'].shift(1)) & (df['Price'] < df['Price'].shift(-1)), 'Lower Low', '' ) )
方式2:使用apply配合explode实现相同效果
mod_df['Lower Low'] = mod_df.groupby('Symbol').apply( lambda df: np.where( (df['Helper_L'] != df['Helper_L'].shift(-1)) & (df['Price'] < df['Price'].shift(1)) & (df['Price'] < df['Price'].shift(-1)), 'Lower Low', '' ) ).explode().reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Gopinathan
相关产品推荐
相关产品推荐

