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

我该如何解决这个问题?


当前回答

这里的大多数解决方案都告诉您如何使用占位符整数来表示null。但是,如果不确定源数据中不会出现整数,那么这种方法就没有帮助。我的方法将格式浮动没有他们的十进制值,并将null转换为None。结果是一个对象数据类型,当加载到CSV中时,它看起来像一个带空值的整数字段。

keep_df[col] = keep_df[col].apply(lambda x: None if pandas.isnull(x) else '{0:.0f}'.format(pandas.to_numeric(x)))

其他回答

试试这个:

df[id]]

如果你输出它的dtypes,你将得到id Int64而不是普通的Int64

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

如果可以修改存储的数据,可以使用一个标记值来替换缺失的id。一个常见的用例,由列名推断,id是一个严格大于零的整数,您可以使用0作为前哨值,这样就可以编写

if row['id']:
   regular_process(row)
else:
   special_process(row)

无论您的pandas系列是对象数据类型还是简单的浮点数据类型,下面的方法都可以工作

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

从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