2016-11-19 98 views
0

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

我正在尝试使过滤数据帧时具有相同Pandas语法的类。

如何复制的语法为数据帧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 

请注意,我也不得不实施我的专栏类的比较方法(系列)。 完整的代码可以看到here

回答

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] 
1

我想你基本上想要的东西只是包装recarray or structured array

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]) 

虽然我自己并没有使用熊猫,但DataFrame看起来好像和一个recarray非常相似。如果您想自己推出,请务必阅读subclassing ndarray。 numpy数组也可以用布尔掩码变量索引,如

myarray = np.array([(1,2.5,3.), 
         (2,3.6,2.), 
         (3,2,7.)]) 
print(myarray[myarray[:,2]<=3.])