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

我该如何解决这个问题?


当前回答

在0.24版本中。+ pandas获得了保存缺少值的整型dtypes的能力。

可空整数数据类型。

Pandas可以使用arrays.IntegerArray表示可能缺少值的整数数据。这是在pandas中实现的扩展类型。它不是整数的默认dtype,也不会被推断出来;你必须显式地将dtype传递给array()或Series:

arr = pd.array([1, 2, np.nan], dtype=pd.Int64Dtype())
pd.Series(arr)

0      1
1      2
2    NaN
dtype: Int64

将列转换为可空整数使用:

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

其他回答

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

我认为@消化1010101的方法更适合Pandas 1.2。+版本,像这样的东西应该做的工作:

df = df.astype({
            'col_1': 'Int64',
            'col_2': 'Int64',
            'col_3': 'Int64',
            'col_4': 'Int64', })

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

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

如果可以删除带有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
import pandas as pd

df= pd.read_csv("data.csv")
df['id'] = pd.to_numeric(df['id'])