我将数据从.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

我该如何解决这个问题?


当前回答

df.loc[~df['id'].isna(), 'id'] = df.loc[~df['id'].isna(), 'id'].astype('int')

其他回答

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

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

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

我的用例是在加载到DB表之前修改数据:

df[col] = df[col].fillna(-1)
df[col] = df[col].astype(int)
df[col] = df[col].astype(str)
df[col] = df[col].replace('-1', np.nan)

删除nan,转换为int,转换为str,然后重新插入nan。

它不漂亮,但它完成了工作!

从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

使用.fillna()将所有NaN值替换为0,然后使用astype(int)将其转换为int

df['id'] = df['id'].fillna(0).astype(int)

与Int64的问题,像许多其他的解决方案,是如果你有空值,他们被替换为<NA>值,这与熊猫默认的'NaN'函数,如isnull()或fillna()不工作。或者,如果您将值转换为-1,则可能会删除您的信息。我的解决方案有点蹩脚,但将用np提供int值。Nan,允许Nan函数在不影响您的值的情况下工作。

            def to_int(x):
                try:
                    return int(x)
                except:
                    return np.nan

            df[column] = df[column].apply(to_int)