Python遍历列表获取公共元素在另一列表索引并生成DataFrame
需求说明
现有两组存储标普500成分股信息的列表,格式如下:
SP500 = ['MSFT', 'AAPL', 'AMZN', 'TSLA', 'GOOGL', 'GOOG', 'FB'] weight500 = [6, 5.9, 3, 2.5, 2.3, 2.1, 2]
另有筛选后的持仓股票代码列表:
portfolio = ['MSFT', 'GOOGL', 'GOOG']
目标是获取portfolio中每只股票在SP500列表的索引值,通过索引匹配对应权重,最终将索引、股票代码、对应权重三类数据存入Pandas DataFrame。
目前已实现单只股票的信息查询,代码如下:
x = input('stock from portfolio:') index = SP500.index(x) print(index) # 输出对应索引 print(x) # 输出股票代码 print(weight500[index]) # 输出对应权重 # 输入MSFT时输出: # 0 # MSFT # 6
也掌握了手动构造三个列表生成DataFrame的方法,需要实现持仓列表的批量遍历、结果自动归集,串联完整流程。
完整实现代码
import pandas as pd # 基础数据源 SP500 = ['MSFT', 'AAPL', 'AMZN', 'TSLA', 'GOOGL', 'GOOG', 'FB'] weight500 = [6, 5.9, 3, 2.5, 2.3, 2.1, 2] portfolio = ['MSFT', 'GOOGL', 'GOOG'] # 初始化空列表承接遍历结果 index_list = [] ticker_list = [] weight_list = [] # 批量遍历持仓列表 for ticker in portfolio: # 复用已验证的单条查询逻辑 idx = SP500.index(ticker) matched_weight = weight500[idx] # 将单条结果追加到对应列表 index_list.append(idx) ticker_list.append(ticker) weight_list.append(matched_weight) # 构造目标DataFrame df = pd.DataFrame( list(zip(index_list, ticker_list, weight_list)), columns=['index', 'portfolio', 'weights'] ) print(df)
运行输出结果:
index portfolio weights 0 0 MSFT 6.0 1 4 GOOGL 2.3 2 5 GOOG 2.1
实现逻辑说明
- 提前初始化三个空列表,替代手动写死的固定值列表,用来按顺序存储每一次遍历得到的索引、股票代码、权重结果
- 用
for循环遍历持仓列表中的每一个股票代码,循环内部直接复用已经验证可用的单只股票查询逻辑,不需要修改原有查询规则 - 每计算出一只股票的对应信息,就用列表的
append()方法把值添加到对应列表的末尾,遍历完成后三个列表的长度、元素顺序和持仓列表完全一一对应 - 最后调用
zip()方法把三个等长列表打包为元组序列,传入pd.DataFrame即可生成目标结构的表格
大数据量优化提示:如果是完整500只成分股、持仓标的较多的场景,每次调用
list.index()都会从头遍历整个SP500列表,查询效率偏低。可以提前构造股票代码到索引、权重的字典映射,把查询复杂度从O(n)降到O(1):# 提前一次性构造映射字典 ticker_info_map = {ticker: (idx, weight) for idx, (ticker, weight) in enumerate(zip(SP500, weight500))} # 后续查询直接按键取值,不需要反复遍历列表 # 例如查询MSFT直接调用ticker_info_map['MSFT']即可得到(0, 6)
内容的提问来源于stack exchange,提问作者StayShmacked
相关产品推荐
相关产品推荐

