我遇到了一些奇怪的错误,经过大量搜索后发现这些错误(可能)是由于我的数据在某些情况下未被视为数值类型导致的。这似乎是因为我使用了Float64 dtype(我认为这是我应该做的)。
简言之; Float64和float64有什么区别?为什么使用Float64数据会破坏很多东西,例如pd.interpolate
?甚至Float64存在的目的是什么?
示例:
import pandas as pd
import numpy as np
TESTDATA = u"""\
val1, val2, val3
1.0, 2.0, 3.0
4.0, 5.0, 6.0
7.0, 8.0, 9.0
10.0, NaN, 12.0
13.0, 14.0, 15.0
"""
df = pd.read_csv(StringIO(TESTDATA), sep=r",\s*", engine='python', dtype=pd.Floa
t64Dtype())
print(df)
print()
print(df.dtypes)
这将输出:
val1 val2 val3
0 1.0 2.0 3.0
1 4.0 5.0 6.0
2 7.0 8.0 9.0
3 10.0 <NA> 12.0
4 13.0 14.0 15.0
val1 Float64
val2 Float64
val3 Float64
dtype: object
到目前为止,一切看起来都很好(正如预期的那样),但现在我尝试:
df.interpolate()
然后获得:
ValueError: Invalid fill method. Expecting pad (ffill) or backfill (bfill). Got linear
在我看来,这很令人困惑,直到我看到其他答案并意识到,这个错误可能是由于interpolate
认为数据是非数字而限制了有效的填充方法(ffill/bfill)。
所以我发现以下内容可行:
df = df.astype(np.float64).interpolate()
print(df.dtypes)
print()
print(df)
输出结果为:
val1 float64
val2 float64
val3 float64
dtype: object
val1 val2 val3
0 1.0 2.0 3.0
1 4.0 5.0 6.0
2 7.0 8.0 9.0
3 10.0 11.0 12.0
4 13.0 14.0 15.0
请注意,将其传递给
np.float64
或仅传递给 float
将产生相同的结果。在
Float64
数据帧上运行 pd.to_numeric(df.val1)
返回一个仍具有 Float64
类型的系列,表明 pandas 确实认识到 Float64
是数值类型。
pandas.Fl
并按Tab时,Float64Dtype
出现,您可以看到它会给人留下使用它的印象)。 - argentum2fnp.nan
可以用于浮点数,但整数没有等价物。因此,扩展整数以处理某种<NA>标志是有意义的,即使它不完全像一个int
那样工作。我想Float
也是以同样的方式添加的,即使它不像int
那样强制需要。但我更了解numpy
,只能推测。 - hpaulj