私は以下のパンダのデータフレームを持っています。条件を満たす十分な数の行を持たないグループをフィルタリングします。
import pandas as pd
# Initialize dataframe
df1 = pd.DataFrame(columns=['bar', 'foo'])
df1['bar'] = ['001', '001', '001', '001', '002', '002', '003', '003', '003']
df1['foo'] = [-4, -3, 2, 3, -3, -2, 0, 1, 2]
>>> print df1
bar foo
0 001 -4
1 001 -3
2 001 2
3 001 3
4 002 -3
5 002 -2
6 003 0
7 003 1
8 003 2
次のしきい値とパラメータを考慮してください。
# Provide threshold and number of entries above and below threshold
threshold = 0
n_below = 2
n_above = 2
私はbar
の特定の値をフィルタリングするデータフレームを作成したいと思います。 bar
のフィルタリングしたいのは、少なくともn_below
の値がfoo
未満で、threshold
とn_above
の値がfoo
より小さく、threshold
より大きい場合です。上記例えば
:
bar = 001
ためthreshold = 0
未満foo
の少なくともn_below = 2
エントリとthreshold = 0
より大きいfoo
の少なくともn_above = 2
エントリがあるので、基bar = 001
は、除外されないであろう。- グループ
bar = 002
は、bar = 002
の場合、少なくともn_above = 2
のエントリがthreshold = 0
より大きいため、除外されます。 - グループ
bar = 003
は、bar = 003
の場合、少なくともn_below = 2
のエントリがfoo
,threshold = 0
未満であるため、フィルタリングされます。
所望の出力は、次のようになります。
# Desired output
bar foo
0 001 -4
1 001 -3
2 001 2
3 001 3
私は、これはGROUPBYと.count()
を用いて達成することができると信じて、しかし私は機能するソリューションを得ることができませんでした。私はそれが2つのステップでこれを行う解決策を書くことがよりきれいかもしれないことを認識している:1)n_below
の条件を満たすための最初のフィルター; 2)その後、n_above
の条件を満たすようにフィルタリングします。