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

我该如何解决这个问题?


当前回答

首先,您需要指定新的整数类型Int8(…Int64),它可以处理空整数数据(pandas版本>= 0.24.0)

df = df.astype('Int8')

但是你可能想要只针对包含NaN/null的整数数据的特定列:

df = df . astype((’col1’:’Int8’’col2’:’Int8’、’col3’:’Int8’)

此时,NaN将被转换为<NA>,如果您希望使用df.fillna()更改默认空值,则需要在希望更改的列上强制使用对象数据类型,否则您将看到 TypeError: <U1不能转换为IntegerDtype

你可以通过 Df = Df .astype(对象)如果你不介意将每个列的数据类型更改为对象(单独地,每个值的类型仍然保留)…或 Df = Df。如果您喜欢针对单个列,则Astype ({"col1":对象,"col2":对象})。

这应该有助于强制将混合了null值的整数列保持为整数格式,并将空值更改为您喜欢的任何值。我不能说这种方法的效率,但它适用于我的格式化和打印目的。

其他回答

使用pd.to_numeric ()

df["DateColumn"] = pd.to_numeric(df["DateColumn"])

简单干净

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

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

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

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

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

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

df = df.astype({
            'col_1': 'Int64',
            'col_2': 'Int64',
            'col_3': 'Int64',
            'col_4': 'Int64', })
df.loc[~df['id'].isna(), 'id'] = df.loc[~df['id'].isna(), 'id'].astype('int')