【问题标题】:Type Hint For NamedTuple Returned By Pandas DataFrame itertuples()Pandas DataFrame itertuples() 返回的 NamedTuple 的类型提示
【发布时间】:2022-07-20 20:45:00
【问题描述】:

ITERTUPLES 是一种迭代 pandas DF 的好方法,它返回一个命名元组。

import pandas as pd
import numpy as np

df = pd.DataFrame({'num_legs': [4, 2], 'num_wings': [0, 2]},index=['dog', 'hawk'])
for row in df.itertuples():
    print(type(row))
    print(row)
<class 'pandas.core.frame.Pandas'>
Pandas(Index='dog', num_legs=4, num_wings=0)
<class 'pandas.core.frame.Pandas'>
Pandas(Index='hawk', num_legs=2, num_wings=2)

向返回的命名元组添加类型提示的正确方法是什么?

【问题讨论】:

  • 我有一个类似的问题,我只需要让 mypy 了解 Pandas 对象可靠地具有 Index 属性。我还没有找到一种方法来做到这一点,而是输入个人 atts,如_index: int = row[0]

标签: python type-hinting typing


【解决方案1】:

我认为这是不可能的,因为您的数据帧可以具有任意数据类型,因此元组将具有数据帧中存在的任意数据类型。与您不能使用 Python 类型提示来指定 DataFrame 的列类型一样,您也不能显式键入那些命名的元组。

如果您在进入 for 循环之前需要列的类型信息,您当然可以使用df.dtypes,它会为您提供包含列类型的系列。

【讨论】:

    【解决方案2】:

    在列名和数据类型固定的情况下,一个可能的解决方案是将 df 行的数据结构显式声明为 NamedTuple:

    import pandas as pd
    
    Row = NamedTuple(
        "Row",
        [("num_legs", int), ("num_wings", int), ("index", str)],
    )
    
    df = pd.DataFrame(
        {"num_legs": [4, 2], "num_wings": [0, 2]}, index=["dog", "hawk"]
    )
    row: Row
    for row in df.itertuples():
        row.num_legs
    

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 2020-08-06
      • 2020-07-31
      • 2021-01-14
      • 1970-01-01
      • 2015-11-23
      • 2021-09-17
      • 2020-03-18
      • 2023-02-19
      相关资源
      最近更新 更多