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
我该如何解决这个问题?
答案 0 :(得分:47)
如果列中的某些值缺失(NaN
),然后转换为数字,则dtype
始终为float
。您无法将值转换为int
。仅限float
,因为type
的{{1}}为NaN
。
float
如果至少有一个print (type(np.nan))
<class 'float'>
:
整数&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