Удалите столбцы из df, где одно из 2 значений имеет очень мало экземпляров

#python #pandas

Вопрос:

У меня есть df, в котором я заметил, что в некоторых столбцах есть 2 разных значения, однако для одного из значений очень мало вхождений. Например, в столбце col x у меня есть два значения: 0 или 1. Однако value_counts() показал мне, что только 2 строки имеют значение 1. Поэтому я хотел бы удалить этот столбец (а не строку).

 df["col x"].value_counts()
0.00000    26868
1.00000        2
Name: col x, dtype: int64
 

Как я могу удалить столбцы из моего фрейма данных, в котором есть только 2 возможных значения, и одно из них имеет очень малое значение (скажем, менее 0,1%)?

Ответ №1:

Вероятно, есть более элегантные решения, но это должно сработать:

 check_max_pct = lambda x : x.value_counts().max()/x.value_counts().sum() < 0.998
df = df.loc[:, [check_max_pct(df[col]) for col in df.columns]]
 

Функция проверяет, составляет ли доминирующее значение в столбце более 99,8% всех значений (может быть скорректировано путем изменения 0.998 значения), поэтому она также должна распространяться на случаи, когда в столбце более двух уникальных значений, но почти все случаи имеет только одно значение.

Ответ №2:

В итоге я получил этот код:

 two_dist_vales_cols = df.loc[:, (df.nunique() == 2)].columns
to_drop = []
for col in two_dist_vales_cols:
    if (df[col].value_counts(ascending=True).iloc[0]) < 15:
        to_drop.append(col)
df.drop(columns=to_drop, axis=1, inplace=True)
 

Сначала я нахожу столбцы, в которых есть только 2 различных значения. Затем пройдите по ним, подсчитайте значения и проверьте наименьшее из них. Если он ниже порогового значения, я добавляю этот столбец в список столбцов, которые необходимо удалить, а затем удаляю их.