如何创建一个带有 dtype 的 pandas 系列,dtype 是 float 的子类?

How to create a pandas Series with a dtype which is a subclass of float?

提问人:royk 提问时间:8/9/2023 最后编辑:royk 更新时间:8/9/2023 访问量:44

问:

我想创建一个派生自 float 类型的 pandas 系列。但是,pandas 会自动将其重铸为 float:

import pandas as pd

class PValue(float):
    def __str__(self):
        if self < 1e-4:
            return '<1e-4'
        return super().__str__()


s = pd.Series([0.1, 0.12e-5])
s = s.map(PValue)

print(s.apply(type)) # -> returns `float`, but I want to get `PValue`
Python 熊猫 dtype

评论

1赞 topsail 8/9/2023
你能用更具体的东西来更新你的问题吗?那个 MyFloat 类看起来特别无用,所以很难看出你要做什么。
0赞 wjandrea 8/9/2023
是的,当心 XY 问题

答:

1赞 wjandrea 8/9/2023 #1

我认为您需要使用扩展类型才能使其按照您想要的方式工作。

但是,只有一个方法的类可能不应该是一个类。查看 PyCon 2012 中 Jack Diederich 的 Stop Writing Classes。您可以使用格式化程序函数执行相同的操作:

def pvalue(x: float) -> str:
    if x < 1e-4:
        return '<1e-4'
    return str(x)

然后例如:

s = pd.Series([0.1, 0.12e-5])
with pd.option_context('display.float_format', pvalue):
    s
0     0.1
1   <1e-4
dtype: float64

或者,为了在 DataFrame 中使用,如果您不想将所有列的格式设置为 s,请使用样式pvalue

pd.DataFrame({'p': s}).style.format({'p': pvalue})

这在 Jupyter 中显示为 HTML 表,如下所示:

        p
0     0.1
1   <1e-4