Удаление столбцов с высокими пропущенными значениями - PullRequest
3 голосов
/ 23 января 2020

У меня есть ситуация, когда мне нужно отбросить много столбцов моего информационного кадра, где пропущены высокие значения. Я создал новый кадр данных, который дает мне пропущенные значения и соотношение пропущенных значений из моего исходного набора данных.

Мой исходный набор данных - data_merge2 выглядит следующим образом:

A     B      C      D
123   ABC    X      Y
123   ABC    X      Y
NaN   ABC    NaN   NaN
123   ABC    NaN   NaN
245   ABC    NaN   NaN
345   ABC    NaN   NaN

набор данных count выглядит примерно так, что дает мне недостающие счет и соотношение:

     missing_count   missing_ratio
  C    4               0.10
  D    4               0.66

Код, который я использовал для создания набора данных count, выглядит следующим образом:

#Only check those columns where there are missing values as we have got a lot of columns
new_df = (data_merge2.isna()
        .sum()
        .to_frame('missing_count')
        .assign(missing_ratio = lambda x: x['missing_count']/len(data_merge2)*100)
        .loc[data_merge2.isna().any()] )
print(new_df)

Теперь я хочу удалить столбцы из исходного кадра данных, коэффициент пропуска которых составляет> 50%. Как мне этого добиться?

Ответы [ 2 ]

4 голосов
/ 23 января 2020

Использование:

data_merge2.loc[:,data_merge2.count().div(len(data_merge2)).ge(0.5)]
#Alternative
#df[df.columns[df.count().mul(2).gt(len(df))]]

или DataFrame.drop с использованием new_df DataFrame

data_merge2.drop(columns = new_df.index[new_df['missing_ratio'].gt(50)])

Вывод

       A    B
0  123.0  ABC
1  123.0  ABC
2    NaN  ABC
3  123.0  ABC
4  245.0  ABC
5  345.0  ABC
3 голосов
/ 23 января 2020

Добавление другого способа с помощью query и XOR:

data_merge2[data_merge2.columns ^ new_df.query('missing_ratio>50').index]

или pandas путем использования Index.difference

data_merge2[data_merge2.columns.difference(new_df.query('missing_ratio>50').index)]

       A    B
0  123.0  ABC
1  123.0  ABC
2    NaN  ABC
3  123.0  ABC
4  245.0  ABC
5  345.0  ABC
...