当数据框中存在NaN时使用astype时出错

df
     A     B  
0   a=10   b=20.10
1   a=20   NaN
2   NaN    b=30.10
3   a=40   b=40.10

我试过:

df['A'] = df['A'].str.extract('(\d+)').astype(int)
df['B'] = df['B'].str.extract('(\d+)').astype(float)

但我得到以下错误:

ValueError:无法将 float NaN 转换为整数

以及:

AttributeError:只能将.str 访问器与字符串值一起使用,该字符串值在熊猫中使用 np.object_dtype

我该如何解决这个问题?

77

如果列中的某些值丢失(NaN)然后转换为数字,则dtype始终为float。您不能将值转换为int。只能转换为float,因为NaNtypefloat

print (type(np.nan))
<class 'float'>

请参阅docs如何转换值,如果至少有一个NaN

整数 & gt;转换为 float64

如果需要 int 值,您需要将NaN替换为一些int,例如0fillna,然后它完美地工作:

df['A'] = df['A'].str.extract('(\d+)', expand=False)
df['B'] = df['B'].str.extract('(\d+)', expand=False)
print (df)
     A    B
0   10   20
1   20  NaN
2  NaN   30
3   40   40
df1 = df.fillna(0).astype(int)
print (df1)
    A   B
0  10  20
1  20   0
2   0  30
3  40  40
print (df1.dtypes)
A    int32
B    int32
dtype: object
18

pandas & gt;= 0.24现在有一个内置 pandas 整数
这确实允许整数 nan,因此您不需要填充 na。
请注意下面代码中'Int64'中的大写。
这是 pandas 整数,而不是 numpy 整数。

您需要使用:.astype('Int64')

所以,这样做:

df['A'] = df['A'].str.extract('(\d+)', expand=False).astype('float').astype('Int64')
df['B'] = df['B'].str.extract('(\d+)', expand=False).astype('float').astype('Int64')

更多关于熊猫整数 na 值的信息:
https://pandas.pydata.org/pandas-docs/stable/user_guide/gotchas.html#nan-integer-na-values-and-na-type-promotions

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(911)
Azure专用DNS配置不适用于P2SVPN
上一篇
数据内存屏障(DMB)指令是否阻止ARM多核架构中的核心
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(86条)