2016-11-19 92 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.])