考虑以下代码
import numpy as np
import pandas as pd
myDict = ({"Row 1": [10, np.nan],
"Row 2": [10, "NaN"]})
myDf = pd.DataFrame(myDict)
这将导致以下数据框
为什么使用np.nan在第一列中将int转换为小数?
答案 0 :(得分:4)
熊猫在很多方面都依赖Numpy。其中包括空值np.nan
。 Numpy将该值定义为dtype
np.float
。熊猫打算将数据框列存储为一维Numpy数组。 Numpy要求将所有值都强制转换为相同的dtype
。
如果Numpy的整数为空值,但还没有...,这将得到解决。
当熊猫阅读字典并意识到所有值都是数字时,它有两种选择。
dtype
object
,并保留值[10, np.nan]
dtype
float
,并增加整数[10.0, np.nan]
Pandas之所以选择第二个选项,是因为人们几乎总是会进行数值计算,并且float
已针对此类事情进行了优化,而object
并非如此。
在另一列上,[10, "Nan"]
内有一个字符串,Pandas不会尝试将其放入float
并将其保留为object
。您可以自行解决。
答案 1 :(得分:1)
myDict = ({"Row 1": [10.0, np.nan],
"Row 2": [10.0, "NaN"]})
这应该可以解决问题。如果没有,您可以更改熊猫数据框的值
myDf.apply(pd.to_numeric(errors="coerce"))
强制使您可以忽略nan值。
答案 2 :(得分:0)
尝试
import numpy as np
import pandas as pd
myDict = ({"Row 1": [10, np.nan],
"Row 2": [10, "NaN"]})
myDf = pd.to_numeric(myDict, errors="coerce")
答案 3 :(得分:0)
我的猜测是,因为您在第二栏中使用了引号,所以将NaN视为字符串。这样,它就将第2列的数据类型分配为“对象”,而不是整数或浮点数。另外,np.nan被视为浮点数,因此第1列(包括整数和浮点数)被分配了更详细的浮点类型。
使用上面的代码,我运行了以下代码:
In[1]:
type(np.nan)
Out[1]:
float
In[2]:
type("NaN")
Out[2]:
str
In[3]:
myDf.info()
Out[3]:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 2 columns):
Row 1 1 non-null float64
Row 2 2 non-null object
dtypes: float64(1), object(1)
memory usage: 112.0+ bytes