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

我该如何解决这个问题?


当前回答

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

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

其他回答

如果可以删除带有NaN值的行,则可以使用.dropna()。

df = df.dropna(subset=['id'])

另外, 使用.fillna()和.astype()将NaN替换为值并将它们转换为int。

我在处理具有大整数的CSV文件时遇到了这个问题,而其中一些整数缺失(NaN)。使用float作为类型是不可取的,因为我可能会失去精度。

我的解决方案是使用str作为中间类型。 然后,您可以在稍后的代码中将字符串转换为int。我把NaN换成了0,但你可以选择任何值。

df = pd.read_csv(filename, dtype={'id':str})
df["id"] = df["id"].fillna("0").astype(int)

为了说明,这里有一个浮动可能会失去精度的例子:

s = "12345678901234567890"
f = float(s)
i = int(f)
i2 = int(s)
print (f, i, i2)

输出为:

1.2345678901234567e+19 12345678901234567168 12345678901234567890

我的用例是在加载到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。

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

如果你想在链接方法时使用它,你可以使用assign:

df = (
     df.assign(col = lambda x: x['col'].astype('Int64'))
)

几周前,我遇到了一些离散的功能被格式化为“对象”的问题。这个解决方案似乎奏效了。

for col in discrete:
    df[col] = pd.to_numeric(df[col],errors='coerce').astype(pd.Int64Dtype())

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

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

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