Pandas Float64 与 float64 dtypes(注意大写)导致非数字错误?

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数字。

hpa*_*ulj 5

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)

其中NaNnp.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()错误表明扩展数据类型并未针对所有操作实现。有些地方表明它仍处于实验阶段。


mir*_*phd 5

如果您没有看到这一点(没有数据丢失),您可以numpy通过将列值传递到numpy数组并更改其类型来手动将列向下转换为标准类型,此处:to numpy.float64(也重建索引):

df[col_name] = df[col_name].values.astype(float)