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

Pandas转换CSV中PY列为int时触发ValueError的解决方案咨询

解决Pandas中PY列转int失败的问题

看起来你遇到的核心问题是PY列里存在像'BA'这样的非数字字符串,而不是缺失值(NaN),所以dropna和fillna根本没作用——因为这些无效值是实实在在存在的字符串,不是空值。下面给你一步步的解决思路,适合新手操作:

第一步:先找出所有无效值的行(不用手动检查)

首先我们可以用pd.to_numeric的errors='coerce'参数,把所有不能转成数字的字符串变成NaN,然后就能筛选出这些异常行,看看它们到底是什么:

# 先加载数据(先不要用converters,先读成字符串)
cols = ['TI', 'AB', 'PY', 'DI']
df = pd.read_csv('501-1000.csv', sep='\t', header=None, index_col=False, names=cols, usecols=cols, dtype=str)

# 把PY列尝试转成数值,无效值转为NaN
df['PY'] = pd.to_numeric(df['PY'], errors='coerce')

# 筛选出PY为NaN的行,查看异常值
invalid_rows = df[df['PY'].isna()]
print(invalid_rows)

这样你就能看到所有像'BA'的异常行,搞清楚这些无效值的数量和情况,再决定怎么处理。

第二步:根据需求处理异常值

方案1:直接删除含无效值的行(如果这些行没用)

如果这些带非数字PY的行对你的分析没用,直接删掉再转int:

# 删除PY为NaN的行
df_clean = df.dropna(subset=['PY'])
# 转成int类型
df_clean['PY'] = df_clean['PY'].astype(int)

方案2:保留行,把无效值替换成默认值

如果需要保留这些行,可以把NaN替换成你需要的默认值(比如0,或者根据业务逻辑选合理的数值),再转int:

# 填充NaN为0,再转int
df['PY'] = df['PY'].fillna(0).astype(int)

方案3:读取文件时就处理无效值(自定义转换器)

如果你想在读取文件的时候就处理,可以写一个自定义的转换函数,代替直接用int:

def convert_py(value):
    try:
        # 尝试转成int
        return int(value)
    except ValueError:
        # 遇到不能转的,返回NaN(或者你想要的默认值)
        return pd.NA

cols = ['TI', 'AB', 'PY', 'DI']
df = pd.read_csv('501-1000.csv', sep='\t', header=None, index_col=False, 
                 names=cols, usecols=cols, converters={"PY": convert_py})

# 之后再处理NaN,比如删除或填充
df = df.dropna(subset=['PY'])
df['PY'] = df['PY'].astype(int)

为什么你之前的方法失败了?

  • 用converters={"PY":int}直接报错:因为int()函数遇到'BA'这种非数字字符串会直接抛出错误,不会自动处理;
  • dropna没用:因为这些无效值是像'BA'这样的字符串,不是缺失值(NaN),dropna只会删除空值行;
  • astype(int)失败:同样是因为列里还有非数字字符串,无法直接转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:57:07