如何使用pandas按条件筛选数据并获取retdf对应symbol值
问题原因
你当前的代码在筛选时调用了.values属性,会把携带索引(此处索引就是symbol值)的pandas Series对象转换成无索引信息的numpy布尔数组,symbol和收益率的对应关系直接丢失,因此只能拿到布尔判断结果,无法匹配到对应的symbol值。
正确实现逻辑
不要提前将pandas结构转为numpy数组,全程在pandas对象上完成筛选,筛选完成后直接取索引即可得到符合条件的symbol值,修正后的代码如下:
import pandas as pd returns = [0.0322, 0.3211, 0.0032, 0.00349] symbols = ['A', 'B', 'C', 'D'] retdf = pd.DataFrame(returns, index=symbols, columns=['ret']) # 先取收益率最高的3条记录,保留索引信息 top3_ret = retdf.ret.nlargest(3) # 布尔筛选出收益率大于0.03的记录,取索引即为对应symbol match_symbols = top3_ret[top3_ret > 0.03].index.tolist() print(match_symbols)
运行上述代码,输出结果为:
['B', 'A']
补充说明
nlargest(n)方法返回的是按值降序排列的前n条记录组成的Series,会完整保留原索引(即symbol)和对应的值,不会丢失映射关系- 如果你不需要先截取Top3再筛选,也可以直接对全量数据做条件过滤:
retdf[retdf.ret > 0.03].index.tolist(),直接返回全量数据中满足收益率大于0.03的所有symbol - 末尾的
.tolist()是将pandas索引对象转为普通Python列表,不需要列表格式的话可以去掉,直接取.index即可用于后续pandas相关操作
内容的提问来源于stack exchange,提问作者zaster
相关产品推荐
相关产品推荐

