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

时间:2017-01-09 14:57:30

标签: pandas

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访问器,它在pandas中使用np.object_ dtype

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:47)

如果列中的某些值缺失(NaN),然后转换为数字,则dtype始终为float。您无法将值转换为int。仅限float,因为type的{​​{1}}为NaN

float

如果至少有一个print (type(np.nan)) <class 'float'>

,请参见docs转换值的方式
  

整数&gt;施放到float64

如果需要int值,则需要将NaN替换为某些NaN,例如int 0然后它完美无缺:

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

答案 1 :(得分:2)

pandas >= 0.24 现在有一个内置的熊猫整数
这确实允许整数 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')

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