Вы можете попробовать создать новый "tagging_column"
, используя numpy.where()
. Затем используйте его, чтобы создать счетный столбец в groupby
, затем агрегируйте по счетчику. Затем, наконец, рассчитать соотношение. Если коэффициент равен >=20%
Удалить все теги на minus 200 or lower value
.
Обратите внимание:
>>> df = pd.DataFrame({'id':[1,2,3,4,5,6,7,8,9], 'val':[100,200,-250,2000,20312039,12485,-300,-350,-60494]})
>>> df
id val
0 1 100
1 2 200
2 3 -250
3 4 2000
4 5 20312039
5 6 12485
6 7 -300
7 8 -350
8 9 -60494
>>> df['Check Negative 200'] = np.where(df['val'] <=-200, ['Negative 200 or lower'], ['Greater than -200'])
>>> df
id val Check Negative 200 Count
0 1 100 Greater than -200 5
1 2 200 Greater than -200 5
2 3 -250 Negative 200 or lower 4
3 4 2000 Greater than -200 5
4 5 20312039 Greater than -200 5
5 6 12485 Greater than -200 5
6 7 -300 Negative 200 or lower 4
7 8 -350 Negative 200 or lower 4
8 9 -60494 Negative 200 or lower 4
>>> df['Count'] = df.groupby('Check Negative 200')['Check Negative 200'].transform('count')
>>> df
id val Check Negative 200 Count
0 1 100 Greater than -200 5
1 2 200 Greater than -200 5
2 3 -250 Negative 200 or lower 4
3 4 2000 Greater than -200 5
4 5 20312039 Greater than -200 5
5 6 12485 Greater than -200 5
6 7 -300 Negative 200 or lower 4
7 8 -350 Negative 200 or lower 4
8 9 -60494 Negative 200 or lower 4
>>> dd = dict(df['Check Negative 200'].value_counts())
>>> dd
{'Greater than -200': 5, 'Negative 200 or lower': 4}
if dd['Negative 200 or lower']/len(df) > .2:
df = df[df['Check Negative 200'].isin(['Greater than -200'])]
else:
pass
>>> df
id val Check Negative 200 Count
0 1 100 Greater than -200 5
1 2 200 Greater than -200 5
3 4 2000 Greater than -200 5
4 5 20312039 Greater than -200 5
5 6 12485 Greater than -200 5
Вы также можете удалить добавленные столбцы, чтобы ваши столбцы оставались такими же, как входные данные.
>>> del df['Check Negative 200']
>>> del df['Count']
>>> df.reset_index(inplace = True, drop = True)
>>> df
id val
0 1 100
1 2 200
2 4 2000
3 5 20312039
4 6 12485