提问人:royk 提问时间:8/9/2023 最后编辑:royk 更新时间:8/9/2023 访问量:44
如何创建一个带有 dtype 的 pandas 系列,dtype 是 float 的子类?
How to create a pandas Series with a dtype which is a subclass of float?
问:
我想创建一个派生自 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`
答:
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
评论