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

Pandas读取CSV时symbol列NaN识别为浮点型调用lower报错如何解决

解决方法

根因说明

你的代码报错本质是执行顺序错误:原代码写的是str(row["symbol"].lower()),会先对row["symbol"]调用lower方法再转字符串,而空值NaN是float类型,不存在lower方法,直接触发报错。你之前尝试转字符串不生效也是因为转字符串的操作放在了lower调用之后,没有起到作用。

最优方案(推荐)

不要用iterrows嵌套循环,改用Pandas向量化操作,性能更高且代码更简洁,同时从根源避免类型错误:

def symbols_to_ids(self, symbols):
    df = pd.read_csv(os.getcwd() + "/Backtester/Results/Misc/allcoins.csv")
    # 先处理symbol列:空值替换为空字符串→转字符串类型→统一转小写
    df['symbol'] = df['symbol'].fillna('').astype(str).str.lower()
    # 传入的symbols也统一转小写做匹配
    target_symbols = [s.lower() for s in symbols]
    # 批量筛选匹配的id直接返回列表
    return df.loc[df['symbol'].isin(target_symbols), 'id'].tolist()

代码说明

  • fillna('') 提前把所有NaN空值替换为空字符串,消除float类型的空值
  • astype(str) 强制整列转为字符串类型,避免残留非字符串值
  • str.lower() 是Pandas Series内置的字符串处理方法,对整列批量执行小写转换,不会触发类型错误
  • isin批量匹配替代嵌套循环,数据量越大性能优势越明显

兼容原有写法的修改方案

如果你需要保留原来的iterrows遍历逻辑,只需要调整str转换和lower调用的顺序即可:

# 把原判断语句从
if str(row["symbol"].lower()) == str(symbol.lower()):
# 替换为
if str(row["symbol"]).lower() == str(symbol).lower():

调整后会先把row["symbol"]转为字符串再调用lower方法,不会再触发float类型的属性错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:03