我将数据从.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,你可以使用'object'数据类型:

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

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

现在可以创建一个包含nan的pandas列作为dtype int,因为它现在正式添加在pandas 0.24.0上

熊猫0.24。X发行说明 引用:“Pandas已经获得了保存缺少值的整型dtypes的能力

与Int64的问题,像许多其他的解决方案,是如果你有空值,他们被替换为<NA>值,这与熊猫默认的'NaN'函数,如isnull()或fillna()不工作。或者,如果您将值转换为-1,则可能会删除您的信息。我的解决方案有点蹩脚,但将用np提供int值。Nan,允许Nan函数在不影响您的值的情况下工作。

            def to_int(x):
                try:
                    return int(x)
                except:
                    return np.nan

            df[column] = df[column].apply(to_int)

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

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

整数列中缺少NaN代表是熊猫的“陷阱”。

通常的解决方法是简单地使用浮动。