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

含空值的Pandas列转int64类型报错及代码执行异常求助

解决CSV空值引发的类型转换&int()报错问题

嘿,我帮你梳理下问题根源和解决办法:你遇到的核心问题是数据里的空值(空格、空字符串、NaN)没被彻底处理干净,导致转整数时触发报错。咱们一步步来搞定:

第一步:别手动改CSV!用代码统一预处理空值

手动替换空格为NULL很容易漏处理,建议读取CSV时就把所有空白类内容都识别成NaN:

import pandas as pd

# 读取时,把空格、空字符串都标记为NaN
df = pd.read_csv("你的文件.csv", na_values=[" ", ""])

# 先检查目标列的空值情况,心里有数
print("各列空值统计:")
print(df[["word_id", "head_pred_id", "sent_id", "run_id"]].isna().sum())

第二步:处理空值+转换类型

因为int64不支持NaN,你有两个可选方案:

方案1:删掉带空值的行(如果这些是无效数据)

如果空值对应的行是没用的,直接删掉最省心:

# 只保留目标列无空值的行
clean_df = df.dropna(subset=["word_id", "head_pred_id", "sent_id", "run_id"])

# 批量转int64
for col in ["word_id", "head_pred_id", "sent_id", "run_id"]:
    clean_df[col] = clean_df[col].astype("int64")

# 验证类型是否正确
print(clean_df.dtypes)

方案2:用占位符填充空值(如果空值需要保留)

如果空值是有业务意义的(比如代表缺失的ID),可以用合理值填充:

# 用0填充空值(你可以根据业务换成其他值,比如-1)
filled_df = df.fillna({
    "word_id": 0, 
    "head_pred_id": 0, 
    "sent_id": 0, 
    "run_id": 0
})

# 转类型
for col in ["word_id", "head_pred_id", "sent_id", "run_id"]:
    filled_df[col] = filled_df[col].astype("int64")

第三步:修复报错的代码片段

如果你的run_id还是Float64类型(因为有NaN),提取run_id.values[0]会得到nan,转int()必报错。可以加个检查逻辑:

def encode_inputs(sents):
    """
    Given a dataframe which is already split to sentences, encode inputs for rnn classification.
    Should return a dictionary of sequences of sample of length maxlen.
    """
    word_inputs = []
    pred_inputs = []
    pos_inputs = []
    run_id_to_pred = dict()
    
    for sent in sents:
        run_id_val = sent.run_id.values[0]
        # 先检查是不是NaN,是的话跳过或者做其他处理
        if pd.isna(run_id_val):
            print(f"警告:发现空的run_id,跳过该句子")
            continue
        # 处理Float转int的情况
        run_id_int = int(run_id_val) if isinstance(run_id_val, float) else run_id_val
        run_id_to_pred[run_id_int] = get_head_pred_word(sent)
    
    # 记得返回需要的结果,原代码里好像漏了?
    return {
        "word_inputs": word_inputs,
        "pred_inputs": pred_inputs,
        "pos_inputs": pos_inputs,
        "run_id_to_pred": run_id_to_pred
    }

额外排查:有没有隐藏的空白字符?

如果还是报错,检查下run_id列是不是有多个空格的字符串:

# 查看run_id的所有唯一值,找异常
print("run_id的唯一值:")
print(df["run_id"].unique())

# 清理所有首尾空白,再把空字符串转成NaN
df["run_id"] = df["run_id"].str.strip().replace("", pd.NA)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:32:24