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

在Pandas DataFrame中基于现有列新增列时出现NaN值的解决方法

问题解决:从Pandas列提取子串生成新列时出现大量NaN

问题根源

你写的fno_symbolList['expiry'] = fno_symbolList['Name'][10:19]是对Name列的行数据做切片——只取第10到18行的Name值,然后把这些值赋值给新列expiry。因为只有这几行有对应值,其他行没有匹配的索引,所以会被填充为NaN。你真正需要的是对Name列的每个字符串元素提取第10到19位字符(注意Python字符串切片是左闭右开,[10:19]实际取的是索引10到18的字符,共9个字符)。

解决方法

用Pandas的字符串处理属性str,对列中每个字符串元素执行子串提取:

方法1:直接用字符串索引

fno_symbolList['expiry'] = fno_symbolList['Name'].str[10:19]

方法2:使用str.slice()

fno_symbolList['expiry'] = fno_symbolList['Name'].str.slice(start=10, stop=19)

完整修正代码

allowedSegment = [14]
index_symbol = "BANKNIFTY"

fno_url = 'http://public.fyers.in/sym_details/NSE_FO.csv'
fno_symbolList = pd.read_csv(fno_url, header=None)
fno_symbolList.columns = ['FyersToken', 'Name', 'Instrument', 'lot', 'tick', 'ISIN', 'TradingSession', 'Lastupdatedate',
                           'Expirydate', 'Symbol', 'Exchange', 'Segment', 'ScripCode', 'ScripName', 'Ignore_1',
                          'StrikePrice', 'CE_PE', 'Ignore_2']

fno_symbolList = fno_symbolList[fno_symbolList['Instrument'].isin(allowedSegment) & (fno_symbolList['ScripName'] == index_symbol)]

# 正确提取每个字符串的子串
fno_symbolList['expiry'] = fno_symbolList['Name'].str[10:19]

额外提示

如果部分Name列的字符串长度不足19位,提取结果会是字符串实际剩余的字符,不会报错。如果需要过滤这类短字符串,可以先做判断:

# 先保留Name长度>=19的行,再提取子串
fno_symbolList = fno_symbolList[fno_symbolList['Name'].str.len() >= 19]
fno_symbolList['expiry'] = fno_symbolList['Name'].str[10:19]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:00:07