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

我该如何解决这个问题?


当前回答

如果你确实想在一个列中组合整数和nan,你可以使用'object'数据类型:

df['col'] = (
    df['col'].fillna(0)
    .astype(int)
    .astype(object)
    .where(df['col'].notnull())
)

这将用一个整数替换nan(不管哪个),转换为int,转换为object,最后重新插入nan。

其他回答

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

在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')

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

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

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

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'])

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

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

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