Как я могу удалить элементы / столбцы фрейма данных, если по крайней мере 20% их записей принимают определенное значение, используя pandas / numpy? - PullRequest
1 голос
/ 24 октября 2019

Я использую pandas и numpy.

Я хочу удалить каждый столбец в моем фрейме обучающих данных 9000 x 13, где по крайней мере 20% записей принимают значение -200. В этом случае -200 - это как отсутствующее значение или NaN, поэтому я удаляю бесполезные переменные. У меня есть образец данных ниже. Любая помощь будет оценена. Это какая-то попытка: train_mod = train.loc[:, train.isnull().mean() <.2]

A        B        C            D      E                 F          \
5723     0.5       846.25      -200    2.619270         627.50     79.0   
4014     1.5      1016.25      -200    6.810175         848.50     99.0   
4074     2.0      -200.00      -200    -200.000        -200.00    114.0   
4577     1.6       950.50      -200    8.649763         925.50    351.0   
6691     4.7      1469.75      -200   25.820425        1449.75    677.0   
2889     0.5       902.50      -200    2.676091         631.25   -200.0   
4387     2.0      1095.75      -200   12.972673        1082.75    310.0   
4289     1.0       885.50      -200    2.695146         632.50   -200.0   
2887     2.3      1355.00      -200   16.611225        1198.25    129.0   
5694     1.1       936.25      -200    6.821513         849.00    127.0   

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

Вы можете попробовать создать новый "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
0 голосов
/ 24 октября 2019

Это несколько запутанная однострочная строка, которая должна сработать:

df_mod = df[df.columns[(df == -200).sum()/df.shape[0] < 0.2]]

По сути, если смотреть изнутри, мы видим, сколько значений в каждом столбце недопустимо (df == -200). Сумма по этой скобке суммирует логические значения, поэтому она подсчитывает True записей. Мы делим это на количество строк, и там, где это значение составляет менее 20%, столбцы сохраняются. Затем мы берем DataFrame, где столбцы удовлетворяют этому условию, и оставляем столбцы, в которых менее 20% записей недопустимы.

Надеюсь, это поможет!

0 голосов
/ 24 октября 2019
val = -200
rows_20 = df.shape[0] // 5

train_mod = train[[c for c in train.columns if (train[c] == val).sum() <= rows_20]]

Объяснение:

train[c] == val возвращает серию логических значений (True / False). Вызов .sum () для этого подсчитывает количество «истинных» значений. Затем это проверяется по row_20, что составляет 20% от числа строк в кадре данных.

Понимание списка возвращает только столбцы, которые соответствуют условию if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...