【问题标题】:Pandas get from pandas.core.frame.Pandas object熊猫从 pandas.core.frame.Pandas 对象中获取
【发布时间】:2020-02-21 07:05:06
【问题描述】:

我有一个 pandas.core.frame.Pandas 对象,需要根据它的属性名称从它返回一个值。以下代码有效

val = pandas_object.attr_name

但是,我需要更改的属性,所以我需要一些动态的,比如

val = pandas_object.get(attr_name)

pandas 对象没有 getter 函数,因为我收到以下错误

AttributeError: 'Pandas' object has no attribute 'get'

其他 pandas 类似乎也有。 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.get.html

我找不到很多关于这种 oaf pandas 对象的文档。有没有办法获取类似于 .get() 的值?

这是我的对象

Pandas(Index=0, Time_USec=Timestamp('2016-12-19 09:05:00.683243'), OrderId=0, Status='New')

当我按照 adive 使用 getattr 我得到以下错误

print event.__getattr__("Time_USec")

AttributeError: 'Pandas' 对象没有属性 'getattr'

【问题讨论】:

    标签: pandas


    【解决方案1】:

    我偶然发现的另一个解决方案是

    pandas_object.__getattribute__(attr_name)
    

    似乎比

    更自然/直观
    pandas_object.__dict__[attr_name]
    

    不幸的是,与 .get 不同,此方法允许不设置默认值

    【讨论】:

    • Re这个方法允许不设置默认值,你可以试试这个:pandas_object.__dict__.get(attr_name, None),它会返回None或者你放在第二个槽的任何东西作为默认值。至少对我有用。
    【解决方案2】:

    您提到的 Pandas 类实际上是一个动态创建的命名元组 类(参见here)。默认情况下,该类被命名为“Pandas”,但您实际上可以将其命名为任何您想要的名称:

    my_tuples = list(df.itertuples(name='Whatever'))
    assert isinstance(my_tuples[0], tuple)
    assert my_tuples[0].__class__.__name__ == 'Whatever'
    

    正如您从official documentation for named tuples 中看到的,您可以将它们转换为字典,如下所示:

    some_object = some_namedtuple._asdict()
    val = some_object.get(attr_name)
    

    但是一种更 Pythonic 的检索属性的方法是简单地使用内置的 getattr 函数,该函数也适用于任何其他 Python 对象:

    val = getattr(some_namedtuple, attr_name)
    

    【讨论】:

    • pandas_object.__dict__ 在 pandas==1.3.4 中不起作用,但 pandas_object._asdict() 和这个起作用。如果要获取默认值,请使用 getattr(pandas_object, 'attr_name', None)。
    【解决方案3】:

    使用__dict__ 属性。

    考虑以下示例

    attr_name = 'ABCIndex'
    pd.core.frame.algos.__dict__[attr_name]
    
    pandas.types.generic.ABCIndex
    

    【讨论】:

    • 我仍然得到 AttributeError: 'Pandas' object has no attribute 'getattr'
    • 我拥有的对象不是 DataFrame 或 Series。
    • 非常感谢,这完全符合我的要求
    【解决方案4】:

    示例输入:

    row = Pandas(Index=0, OrderId=0, Status='New')
    

    要访问Status,您可以使用:

    row.Status
    # or
    getattr(row, 'Status')
    

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 2019-04-28
      • 1970-01-01
      • 2014-08-25
      • 2015-03-03
      • 2020-11-26
      • 2017-11-03
      • 2019-08-30
      • 1970-01-01
      相关资源
      最近更新 更多