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

Python Pandas drop()函数在Yfinance数据转换后失效求助

解决Pandas删除inTheMoney=True行无效的问题

问题根源

你注释掉的drop代码存在两个关键错误:

  • inTheMoney列是布尔类型(True/False),不是字符串'True',用字符串比较会完全匹配不到目标行
  • 条件逻辑反了:你要删除inTheMoney=True的行,但代码写的是df['inTheMoney'] != 'True'——布尔值永远不等于字符串,这会导致所有行都被保留

另外,用for循环遍历DataFrame既低效又容易出错,Pandas本身提供了更简洁的矢量化操作,完全没必要这么做。

正确解法

方法1:布尔索引直接过滤(推荐)

直接筛选出inTheMoney=False的行,覆盖原DataFrame,写法简洁高效:

import yfinance as yf
import pandas as pd

price = 100
ticker = yf.Ticker("SPY")
opt = ticker.option_chain('2022-11-18')
df = pd.DataFrame(opt.puts)

# 保留inTheMoney为False的行(等价于删除True的行)
df = df[~df['inTheMoney']]
# 或者写全条件:df = df[df['inTheMoney'] == False]

# 删除不需要的列
df = df.drop(['contractSymbol', 'lastTradeDate', 'change', 'percentChange', 'volume', 'openInterest', 'impliedVolatility', 'contractSize', 'currency'], axis=1)
print(df)

方法2:使用drop函数修正版

如果坚持用drop,需修正条件和类型匹配:

# 定位inTheMoney=True的行索引并删除
df = df.drop(df[df['inTheMoney'] == True].index)

可选:验证数据类型

如果不确定列的类型,可以先打印确认:

print(df['inTheMoney'].dtype)

正常输出应为bool,说明是布尔类型,直接用True/False比较即可。

内容的提问来源于stack exchange,提问作者Paul Park

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:05:25