0

如何在 Pandas 中实现过滤数据帧的语法?( df[df.column1 > someValue])

在过滤数据帧时,我正在尝试创建一个与 Pandas 具有相同语法的类。

如何复制这样的 Dataframe 的语法df = DataFrame(someData)

df[df.column1 > someValue]

我实现了方法__getattr____getitem__语法

df.column1 
df['column1']

但我不知道如何将两者联系在一起。另外,我找不到从 Pandas 代码中复制的功能。

对此问题的实现或对 Pandas 中函数的引用都会有很大帮助。

编辑:(解决方案)

按照答案的提示,我实现了__getitem__如下功能:

from tier tools import compress

def __getitem__(self, name):
    """Get items with [ and ]
    """
    #If there is no expression, return a column
    if isinstance(name, str):
      return self.data[name]

    #if there was an expression return the dataframe filtered
    elif isinstance(name, list):
      ind = list(compress(range(len(name)), name))
      temp = DataFrame([[self.data[c].values[i] 
                            for i in ind] 
                           for c in self.columns],
                           columns=self.columns)
      return temp

请注意,我还必须为我的列类(系列)实现比较方法。完整的代码可以在这里看到。

4

2 回答 2

1

您需要实施__getitem__以获取布尔值列表,并且仅在True. 您还需要实现条件运算符(>,==等)以返回该布尔值列表,例如(概念验证代码):

class A(object):
    def __init__(self, data):
        self.data = data
    def __getitem__(self, key):
        return A([d for k, d in zip(key, self.data) if k])
    def __gt__(self, value):
        return [d > value for d in self.data]
    def __repr__(self):
        return str(self.__class__) + ' [' + ', '.join(str(d) for d in self.data) + ']'

>>> a = A(list(range(20)))
>>> a
<class '__main__.A'> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> a[a > 5]
<class '__main__.A'> [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
于 2016-11-19T15:18:26.447 回答
1

我认为您基本上想要一些只包装recarray 或结构化数组的东西。

import numpy as np

myarray = np.array([("Hello",2.5,3),
                        ("World",3.6,2),
                        ('Foobar',2,7)]).T

df = np.core.records.fromarrays(myarray, 
                             names='column1, column2, column3',
                             formats = 'S8, f8, i8')

print(df)
print(df[df.column3<=3])

虽然我自己不使用 Pandas,但 DataFrame 看起来与 rearray 非常相似。如果您想自己动手,请务必阅读有关子类化 ndarray的内容。numpy 数组也可以使用布尔掩码变量进行索引,例如

myarray = np.array([(1,2.5,3.),
                        (2,3.6,2.),
                        (3,2,7.)])
print(myarray[myarray[:,2]<=3.])
于 2016-11-19T18:41:28.623 回答