如何按symbol分组对DataFrame应用bbands函数并新增列?
解决方案
核心问题分析
直接用groupby.apply调用ta.bbands会返回包含多列的DataFrame,与原DataFrame的列结构不匹配,导致赋值报错。需要在分组内仅提取目标列,返回Series以保证索引对齐。
完整代码实现
import pandas as pd import pandas_ta as ta # 假设你的DataFrame名为df df['bbm'] = df.groupby('symbol')['close'].apply( lambda x: x.ta.bbands(length=20, std=2)['BBM_20_2.0'] )
代码细节说明
- 独立分组计算:按
symbol分组,确保每个标的的布林带计算互不干扰。 - 精准提取目标列:在
apply的匿名函数中,仅对每组的close列调用布林带计算,并直接提取返回结果中的BBM_20_2.0(布林带中轨)列,返回Series类型。 - 自动索引对齐:返回的Series保留了原DataFrame的索引,赋值时会自动与原数据行一一对应,无需额外合并操作。
结果验证
执行后原DataFrame会新增bbm列,每个symbol的前19行值为NaN(因布林带需要20个周期数据初始化),后续行则为对应标的的布林带中轨值。
内容的提问来源于stack exchange,提问作者DaveTheRave
相关产品推荐
相关产品推荐

