2017-12-27 29 views
1

私は1つの列に基づいてフィルタを実行しようとしています。例えば、私はそれが持って見るたびにトランザクションを削除したい入力Pythonで複雑なフィルタを行う方法

Date  Trans account_no 
2017-12-11 10000 1111 
2017-12-11 10000 1112 
2017-12-11 10000 1113 
2017-12-11 10001 1111 
2017-12-11 10002 1113 

所望の出力

1111 ACCOUNT_NO

Date  Trans account_no 
2017-12-11 10002 1113 

編集:

これは、オペレータチェーン理由とは異なっています複製/条件付きフィルタを扱っています

+0

[パンダ:オペレータ連鎖を有するデータフレームのフィルタ列]の可能な重複(https://stackoverflow.com/questions/11869910/pandas-filter-rows-of-dataframe-with-operator-chaining ) – splash58

+0

操作後に「2017-12-11 10000 1113」が消えたのはなぜですか? – Tai

答えて

2

+ transform

df[~df.groupby('Trans').account_no.transform(lambda x : set([1111]).issubset(x))] 
Out[1658]: 
     Date Trans account_no 
4 2017-12-11 10002  1113 
+0

1111だけでなく複数の数字を除外するコードを修正する方法を知っていますが、1112 –

+0

@ReeseFitzmaurice 'df [〜df.Trans.isin(df.loc [df.account_no.isin([1112 、1111])、 'Trans'])] ' – Wen

+0

私はまだ元の質問ロジックを維持しようとしていますが、これは機能しますか? df = df [〜df.groupby( 'Trans')。account_no.transform(lambda x:set([1112,1111])。issubset(x))] –

1

issubsetを使用することにより、2つのステップでこれを行うことができます。最初にを使用しての値のうち、account_noが1111に等しいことがあります。そして、あなたがシリーズに基づいてフィルタリングする.locを使用することができますisin()

df[~df.Trans.isin(df.loc[df.account_no == 1111,'Trans'])] 

     Date Trans account_no 
4 2017-12-11 10002  1113 
0

と他のすべてのトランザクションを選択します。

def complex_filter_criteria(x): 
    return x != 1111 
df.loc[df['account_no'].apply(complex_filter_criteria)] 

df['account_no'].apply(complex_filter_criteria)カラムaccount_no内の各エントリに対してTrue/False評価の一連を戻します。次に、それをdf.locに渡すと、系列からのTrueの評価に対応する行のみからなるデータフレームが返されます。

enter image description here

関連する問題