【问题标题】:Pandas: custom class as column header with multi indexingPandas:自定义类作为具有多索引的列标题
【发布时间】:2018-09-08 21:05:11
【问题描述】:

我正在尝试将对象用作多索引中的列标题 数据框,但我似乎无法让它工作。 __eq__, __hash____str__ 仅适用于简单的数据帧。

这是一个小例子:

class Signal:

    def __init__(self, name):
        self.name = name


    def __eq__(self, other):
        try:
            return self.name == other or self.name == other.name
        except AttributeError as err:
            return False

    def __str__(self):
        return str(self.name)

    def __hash__(self):
        return hash(self.name)

if __name__ == '__main__':
    import pandas as pd
    import numpy as np
    a = Signal('name')
    b = Signal('name2')
    c = Signal('something')

    data = {
        ('A', a): np.arange(2),
        ('A', b): np.ones(2),
        ('B', c): np.zeros(2)
    }

    df = pd.DataFrame(data)

    print(df)
    print('-----------')
    print(df['A'])

我还尝试实现__le__, __ge____ne__。那没有 做任何事。我真的不知道我还能做什么。 有人有什么想法吗?

【问题讨论】:

  • 您的列名是元组,所以df['name'] 将不起作用,但如果您这样做df[('A', 'name')],这将返回一些数据.. 但不确定您要在这里做什么?
  • 不是。如果您运行该示例,您将看到 pandas 不会创建 MultiIndex。 df['name'] 只是一种类型,但我应该能够只使用 0 级列名称,例如 df['A']。我正在尝试创建一个 MultiIndex,但使用对象作为列标题。

标签: python pandas multi-index


【解决方案1】:

定义__lt____gt__之后

class Signal:

    def __init__(self, name):
        self.name = name


    def __eq__(self, other):
        try:
            return self.name == other or self.name == other.name
        except AttributeError as err:
            return False

    def __lt__(self, other):
        return self.name < other.name

    def __gt__(self, other):
        return self.name > other.name

    def __str__(self):
        return str(self.name)

    def __hash__(self):
        return hash(self.name)

import pandas as pd
import numpy as np
a = Signal('name')
b = Signal('name2')
c = Signal('something')

data = {
    ('A', a): np.arange(2),
    ('A', b): np.ones(2),
    ('B', c): np.zeros(2)
}

df = pd.DataFrame(data)

print(df, df['A'], sep='\n\n')

     A               B
  name name2 something
0    0   1.0       0.0
1    1   1.0       0.0

   name  name2
0     0    1.0
1     1    1.0

【讨论】:

  • 毕竟是__lt____gt__。我向上帝发誓我也试过这个。一定在某个地方有一个类型。感谢您的澄清。
猜你喜欢
  • 2014-07-10
  • 2020-08-18
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2016-10-28
  • 2021-02-22
相关资源
最近更新 更多