我有以下熊貓數據框。篩選出沒有足夠數量的行滿足條件的組
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
不會被過濾掉,由於用於bar = 001
有小於threshold = 0
至少n_below = 2
條目foo
和至少n_above = 2
條目foo
比threshold = 0
更大。 - 該組
bar = 002
將被過濾掉,因爲對於bar = 002
,至少有n_above = 2
條目的foo
大於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()
來完成,但我一直無法得到一個可行的解決方案。我認識到,編寫一個解決方案可能會更清潔,分兩步進行:1)首先篩選以滿足n_below
條件; 2)然後過濾以符合n_above
條件。