将'-'替换为 np.nan 会在熊猫中将数据类型转换为浮点数



我有一个熊猫df,如下所示:

+------+----+
|  x   |  y |
+------+----+
|ABCD  | -  |           
|DEFG  | -  |
+------+----+

xy的数据类型为对象,在使用以下将"-"替换为nan之后

df = df.replace('-', np.NaN)

它将列y的数据类型转换为float,而列y的数据类型应保留为object。此外,当我试图找出用NA值替换后具有NA值的列的列表时,它不显示任何具有NA值,而列y具有NA值。为什么会引起这个问题?

编辑:我能够找到具有NA值的列,如下

df.columns[df.isna().any()].tolist()

原因是列中只有NaNs将列转换为浮点值。可能的解决方案是由原始dtype使用DataFrame.astype

df = df.replace('-',np.NaN).astype(df.dtypes)
print (df.dtypes)
x    object
y    object
dtype: object
print (df.applymap(type))
x                y
0  <class 'str'>  <class 'float'>
1  <class 'str'>  <class 'float'>

如果想要缺少值的测试列,请使用:

print (df.columns[df.isna().any()])
Index(['y'], dtype='object')

另一个类似的想法是只提取NaNs列并将其转换为对象:

df = df.replace('-',np.NaN)

d = dict.fromkeys(df.columns[df.isna().all()], 'object')
print (d)
{'y': 'object'}
df = df.astype(d)
print (df.dtypes)
x    object
y    object
dtype: object

最新更新