2016-11-19 16 views
0

パンダでデータフレームをフィルタリングする構文を実装するにはどうすればよいですか? (df[df.column1 > someValue]パンダの構文を複製するには? (データフレームをフィルタリングする)

私は、データフレームをフィルタリングするときにPandasと同じ構文を持つクラスを作成しようとしています。

df[df.column1 > someValue] 

私は

df.column1 
df['column1'] 

の構文のための方法__getattr____getitem__を実装しかし、私は方法がわからない:私はこの1つのようDATAFRAME df = DataFrame(someData)の構文を複製するにはどうすればよい

両方を一緒にリンクする。また、私はパンダのコードからコピーする機能を見つけることができませんでした。

この問題の実装か、Pandasの関数への参照は大きな助けになります。

編集:私も私のコラムクラスの比較メソッドを実装する必要がありました

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 

注:次のように私は__getitem__機能を実装した回答にヒント後(ソリューション)

(シリーズ)。 フルコードはhereで見ることができます。

答えて

1

を実装して、ブール値のリストを取得し、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]) 

私はPandasを自分で使用しませんが、DataFrameは再配列とよく似ているようです。独自のロールを作成したい場合は、subclassing ndarrayを必ず読んでください。 numpy配列は、ブール値のマスク変数、たとえば

myarray = np.array([(1,2.5,3.), 
         (2,3.6,2.), 
         (3,2,7.)]) 
print(myarray[myarray[:,2]<=3.]) 
などでも索引付けできます。
関連する問題