我将数据从.csv文件读取到Pandas数据框架,如下所示。对于其中一列,即id,我想将列类型指定为int。问题是id系列有缺失/空值。

当我试图在读取.csv时将id列强制转换为整数时,我得到:

df= pd.read_csv("data.csv", dtype={'id': int}) 
error: Integer column has NA values

或者,我尝试转换列类型后,阅读如下,但这一次我得到:

df= pd.read_csv("data.csv") 
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer

我该如何解决这个问题?


当前回答

我也遇到过类似的问题。这就是我的解决方案:

def toint(zahl = 1.1):
    try:
        zahl = int(zahl)
    except:
        zahl = np.nan
    return zahl

print(toint(4.776655), toint(np.nan), toint('test'))

4 楠楠

df = pd.read_csv("data.csv") 
df['id'] = df['id'].astype(float)
df['id'] = toint(df['id'])

其他回答

从Pandas 1.0.0开始,你可以使用Pandas了。NA的价值观。这不会强制缺少值的整数列为浮点数。

在读取数据时,您需要做的是:

df= pd.read_csv("data.csv", dtype={'id': 'Int64'})  

注意'Int64'被引号括起来,I是大写的。这区分了Panda的'Int64'和numpy的'Int64'。

作为旁注,这也适用于.astype()

df['id'] = df['id'].astype('Int64')

文件在这里 https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html

使用pd.to_numeric ()

df["DateColumn"] = pd.to_numeric(df["DateColumn"])

简单干净

对于任何需要在包含NULL/ nan的列中具有int值,但在其他答案中提到的不能使用pandas版本0.24.0可空整数特性的约束下工作的人,我建议使用pd.where将列转换为对象类型:

df = df.where(pd.notnull(df), None)

这将数据帧中的所有nan转换为None,将混合类型的列作为对象,但将int值保留为int,而不是float。

因为我在这里没有看到答案,我不妨加上它:

如果你因为某种原因仍然不能处理np,可以用一行程序将nan转换为空字符串。Na或者pd。我和我一样,在使用旧版本的熊猫库时:

df select_dtypes(“当家”)。astype (str) fillna(- 1)。replace(“- 1”、“)

我在使用pyspark时遇到了这个问题。由于这是运行在jvm上的代码的python前端,它需要类型安全,使用float而不是int是不可取的。我把熊猫包裹起来,解决了这个问题。函数中的Read_csv,该函数将在将用户定义的列转换为所需类型之前,用用户定义的填充值填充用户定义的列。这是我最终使用的:

def custom_read_csv(file_path, custom_dtype = None, fill_values = None, **kwargs):
    if custom_dtype is None:
        return pd.read_csv(file_path, **kwargs)
    else:
        assert 'dtype' not in kwargs.keys()
        df = pd.read_csv(file_path, dtype = {}, **kwargs)
        for col, typ in custom_dtype.items():
            if fill_values is None or col not in fill_values.keys():
                fill_val = -1
            else:
                fill_val = fill_values[col]
            df[col] = df[col].fillna(fill_val).astype(typ)
    return df