【问题标题】:How to specify the type of pandas series elements in type hints?如何在类型提示中指定 pandas 系列元素的类型?
【发布时间】:2020-01-11 06:36:21
【问题描述】:

我的函数返回一个熊猫系列,其中所有元素都有特定的类型(比如str)。下面的 MWE 应该会给人一个印象:

import pandas as pd 
def f() -> pd.Series:
    return pd.Series(['a', 'b']) 

在我想明确的类型提示中,f()[0] 将始终是str 类型(例如,与返回pd.Series([0, 1]) 的函数相比)。我这样做了:

def f() -> pd.Series[str]:

但是

TypeError: 'type' object is not subscriptable

那么,如何在类型提示中指定 pandas 系列元素的类型呢?有什么想法吗?

【问题讨论】:

  • pd.Series(dtype=str) 允许您指定系列元素的数据类型。我的猜测是这也适用于类型提示。
  • pd.Series(dtype=str) 不适用于类型提示。
  • 熊猫中有“str”类型吗?不确定,根据pbpython.com/pandas_dtypes.html(但可能已弃用?)
  • @ItamarMushkin:只是出于好奇,您为什么认为pd.Series(dtype=str) 不适用于类型提示?我的 3.7 解释器至少在语法上接受它。
  • @jottbe -- 它不是有效的 PEP 484 类型。因此,虽然没有什么能阻止您编写这样的类型提示,但它最终会导致任何旨在分析 PEP 484 类型提示的工具阻塞。 (静态类型检查器、linter、自动完成工具......)。失去对这些工具的访问权限会大大降低类型提示的实用性,以至于您最好根本不使用它们。

标签: python pandas series type-hinting


【解决方案1】:

您可以利用typing.TypeVar 来完成此操作:

from typing import (
    TypeVar
)

SeriesString = TypeVar('pandas.core.series.Series(str)')
def f() -> SeriesString:

【讨论】:

    【解决方案2】:

    不幸的是,Python 的类型提示不支持这个现成的。尽管如此,您始终可以使用 dataenforce 库 (link) 添加提示甚至强制验证。

    【讨论】:

    【解决方案3】:

    您可以使用 dtype 参数指定

    pd.Series(data, dtype=str) 更多信息click here

    【讨论】:

    • 嗨莫汉,谢谢你的回答。不幸的是,该解决方案不起作用,因为data 是一个未解决的参考,还是我遗漏了什么?
    • 嗨@Qaswed,数据是您想要将其添加到系列中的数据。对于您的问题,下面的代码将起作用。数据类型将显示为对象。 str 数据类型也是对象类型import pandas as pd pd.Series(['a', 'b'], dtype='str')
    【解决方案4】:

    对于 python 3.8 试试:

    def f() -> "pd.Series[str]":
        pass
    

    或:

    f_return_type = "pd.Series[str]"
    def f() -> f_return_type:
        pass
    

    # type: pd.Series[str] 用于变量

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2017-04-25
      • 2016-10-16
      • 2022-07-28
      • 2020-01-20
      • 2014-09-11
      相关资源
      最近更新 更多