arg*_*m2f 14 types casting numpy pandas
我遇到了一些奇怪的错误,经过多次搜索后,这些错误似乎(可能)来自我的数据在某些情况下不被视为数字。这似乎是因为我使用了 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)
Run Code Online (Sandbox Code Playgroud)
这输出:
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
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切看起来都不错(如预期),但现在我尝试:
df.interpolate()
Run Code Online (Sandbox Code Playgroud)
并得到:
ValueError: Invalid fill method. Expecting pad (ffill) or backfill (bfill). Got linear
Run Code Online (Sandbox Code Playgroud)
这对我来说相当令人困惑,直到我遇到其他答案并意识到可能会出现此错误,因为interpolate认为数据是非数字的,因此将有效的填充方法限制为 ffill/bfill。
所以我发现以下方法有效:
df = df.astype(np.float64).interpolate()
print(df.dtypes)
print()
print(df)
Run Code Online (Sandbox Code Playgroud)
与输出:
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
Run Code Online (Sandbox Code Playgroud)
请注意,给出它np.float64或仅float给出相同的结果。
pd.to_numeric(df.val1)在数据帧上运行Float64返回了一个仍然具有Float64类型的序列,表明 pandas 似乎确实识别出了Float64数字。
In [52]: pd.Float64Dtype?
Init signature: pd.Float64Dtype()
Docstring:
An ExtensionDtype for float64 data.
This dtype uses ``pd.NA`` as missing value indicator.
Run Code Online (Sandbox Code Playgroud)
使用floatdtype 时,框架显示为
In [68]: df
Out[68]:
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 NaN 12.0
4 13.0 14.0 15.0
Run Code Online (Sandbox Code Playgroud)
其中NaN是np.nan,一个有效的浮点数。
In [71]: df
Out[71]:
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
Run Code Online (Sandbox Code Playgroud)
<NA>那是哪里pandas._libs.missing.NAType
您的df.interpolate()错误表明扩展数据类型并未针对所有操作实现。有些地方表明它仍处于实验阶段。
如果您没有看到这一点(没有数据丢失),您可以numpy通过将列值传递到numpy数组并更改其类型来手动将列向下转换为标准类型,此处:to numpy.float64(也重建索引):
df[col_name] = df[col_name].values.astype(float)