You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历Pandas DataFrame根据拆股列值计算调整后持股数量

问题原因分析
  1. 初始赋值写法逻辑错误:你的ownership列是固定值1000,每次计算ownerAdj时都取前一行的固定1000计算,没有保留上一次拆股调整后的持股量,因此拆股日之后数值会直接变回1000。
  2. 循环写法报错原因:iterrows()返回的row是对应单行的Series,row["ownership"]是单个浮点数值,只有DataFrame/Series类才有shift()方法,单个数值调用该方法自然会抛出属性错误。
正确实现方案

最优方案:向量化累计乘积(效率最高)

拆股调整是累计效应,我们只需要将无拆股时的比例替换为1,计算累计拆股倍数后乘以初始持股量即可,不需要遍历:

import yfinance as yf
aapl = yf.Ticker("AAPL")
hist = aapl.history(start="2014-06-01")
init_shares = 1000

# 替换无拆股时的0为1,计算到当前日期为止的累计拆股倍数
hist['split_cum'] = hist['Stock Splits'].replace(0, 1).cumprod()
# 调整后持股量 = 初始持股量 * 累计拆股倍数
hist['ownerAdj'] = init_shares * hist['split_cum']

运行后2014-06-09拆股后ownerAdj会稳定为7000,2020-08-31 4:1拆股后会变为28000并保持,完全符合需求。

遍历实现方案(逻辑直观)

如果需要用遍历逻辑实现,维护一个变量记录当前持股量即可:

init_shares = 1000
current_shares = init_shares
adj_list = []

for split_ratio in hist['Stock Splits']:
    if split_ratio != 0:
        current_shares *= split_ratio
    adj_list.append(current_shares)

hist['ownerAdj'] = adj_list

内容的提问来源于stack exchange,提问作者Sam.H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:45:03