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

我该如何解决这个问题?


当前回答

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

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

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

其他回答

假设您的DateColumn格式3312018.0应该转换为03/31/2018作为字符串。并且,一些记录丢失或为0。

df['DateColumn'] = df['DateColumn'].astype(int)
df['DateColumn'] = df['DateColumn'].astype(str)
df['DateColumn'] = df['DateColumn'].apply(lambda x: x.zfill(8))
df.loc[df['DateColumn'] == '00000000','DateColumn'] = '01011980'
df['DateColumn'] = pd.to_datetime(df['DateColumn'], format="%m%d%Y")
df['DateColumn'] = df['DateColumn'].apply(lambda x: x.strftime('%m/%d/%Y'))

如果可以修改存储的数据,可以使用一个标记值来替换缺失的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', })

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

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