TypeError:float() 参数必须是字符串或数字,而不是“NAType”

mnm*_*mnm 4 python null pandas dtype

我的数据框中有一列包含 nan 值和 int 值。原来的dType是float64,但我试图将其更改为int6,并将nan值更改为np.nan。现在我收到此错误: TypeError: float() argument must be a string or a number, not 'NAType' 当尝试对其进行插补时。在下表中,列类似于“年龄”

data = {'name':  ['Alex', 'Ben', 'Marry','Alex', 'Ben', 'Marry'],
        'job': ['teacher', 'doctor', 'engineer','teacher', 'doctor', 'engineer'],
        'age': [27, 32, 78,27, 32, 78],
        'weight': [160, 209, 130,164, 206, 132],
        'date': ['6-12-2022', '6-12-2022', '6-12-2022','6-13-2022', '6-13-2022', '6-13-2022']
        }

df = pd.DataFrame(data) df

    |name   |job        |age|weight |date
|---|-------|-----------|---|-------|--------
|0  |Alex   |teacher    |27 |160    |6-12-2022
|1  |Ben    |doctor     |32 |209    |6-12-2022
|2  |Marry  |engineer   |78 |130    |6-12-2022
|3  |Alex   |teacher    |27 |164    |6-13-2022
|4  |Ben    |doctor     |32 |206    |6-13-2022
|5  |Marry  |engineer   |78 |132    |6-13-2022
|6  |Alex   |teacher    |NaN|NaN    |6-14-2022
|7  |Ben    |doctor     |NaN|NaN    |6-14-2022
|8  |Marry  |engineer   |NaN|NaN    |6-14-2022
Run Code Online (Sandbox Code Playgroud)

这就是我尝试过的:

df['age']=df['age'].astype( dtype={'age': pd.Int8Dtype()})
df.loc[df.age== '<NA>', 'age']=np.nan
Run Code Online (Sandbox Code Playgroud)

有没有办法将 float64 更改为较小的数据类型而不引起此问题?请指教,谢谢

7sh*_*hoe 5

使用

df['age'] = df['age'].astype(dtype='Int64')
Run Code Online (Sandbox Code Playgroud)

使用扩展数据类型Int64(大写I)而不是默认值dtypeint64小写i)。后者运行一段IntCastingNaNError时间,前者工作顺利。

此功能已添加到Pandas 0.24中并在此线程中提到。