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

我该如何解决这个问题?


当前回答

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

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

其他回答

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

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

从Pandas 1.0.0开始,你可以使用Pandas了。NA的价值观。这不会强制缺少值的整数列为浮点数。

在读取数据时,您需要做的是:

df= pd.read_csv("data.csv", dtype={'id': 'Int64'})  

注意'Int64'被引号括起来,I是大写的。这区分了Panda的'Int64'和numpy的'Int64'。

作为旁注,这也适用于.astype()

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

文件在这里 https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html

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

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

df= pd.read_csv("data.csv")
df['id'] = pd.to_numeric(df['id'])
df.loc[~df['id'].isna(), 'id'] = df.loc[~df['id'].isna(), 'id'].astype('int')