Pandas 中 Float64 和 float64 数据类型(注意大小写)导致非数值错误?

14

我遇到了一些奇怪的错误,经过大量搜索后发现这些错误(可能)是由于我的数据在某些情况下未被视为数值类型导致的。这似乎是因为我使用了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 是数值类型。
2个回答

5
In [52]: pd.Float64Dtype?
Init signature: pd.Float64Dtype()
Docstring:     
An ExtensionDtype for float64 data.

This dtype uses ``pd.NA`` as missing value indicator.

使用 float 数据类型,该框架将显示为:
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

其中 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

其中 <NA> 是指 pandas._libs.missing.NAType

你的 df.interpolate() 错误提示表明扩展数据类型没有为所有操作实现。 一些地方建议它仍处于实验阶段。


为了完整起见,您是否对这些“扩展数据类型”的目的有更深入的了解?如果它们不是通常向后兼容或受到核心包的支持,它们似乎更像是旨在解决某些问题的实验性功能,而不是应该作为默认/标准处理浮点数的方式呈现给普通用户(如我)。 (可能是有意这样做,也可能不是,但当我键入pandas.Fl并按Tab时,Float64Dtype出现,您可以看到它会给人留下使用它的印象)。 - argentum2f
数据加载到pandas中时,经常存在未定义的值。虽然np.nan可以用于浮点数,但整数没有等价物。因此,扩展整数以处理某种<NA>标志是有意义的,即使它不完全像一个int那样工作。我想Float也是以同样的方式添加的,即使它不像int那样强制需要。但我更了解numpy,只能推测。 - hpaulj
1
请查看 https://github.com/pandas-dev/pandas/issues/40252 的相关编程内容 - Matěj Šmíd

5
如果您觉得没有意义(没有数据丢失),您可以通过将列值传递给一个numpy数组并改变其类型来手动将该列降级为标准的numpy类型,例如:numpy.float64(这也重构了索引):

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


这有可能出问题吗? - jtlz2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接