在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
相关产品推荐
相关产品推荐

