У меня есть большой кадр данных pandas [df] с сотнями имен столбцов. Я хочу удалить все столбцы с более чем 50% значениями NAN, но только те столбцы, которые имеют слово «test» в заголовке столбцов. Есть ли простой способ сделать это? & благодарю вас за помощь!Отбрасывать столбцы с похожими именами с более чем 50% nan в pandas
ответ
IIUC вы можете сделать что-то вроде этого:
In [122]:
df = pd.DataFrame({'test':np.NaN, 'asd':0,'test 1':[0,1,np.NaN,3,4]})
df
Out[122]:
asd test test 1
0 0 NaN 0.0
1 0 NaN 1.0
2 0 NaN NaN
3 0 NaN 3.0
4 0 NaN 4.0
In [138]:
cols = df.columns[df.columns.str.contains('test')]
to_remove = cols[df[cols].isnull().sum() > len(df)/2]
to_remove
Out[138]:
Index(['test'], dtype='object')
In [140]:
df.drop(to_remove, axis=1)
Out[140]:
asd test 1
0 0 0.0
1 0 1.0
2 0 NaN
3 0 3.0
4 0 4.0
Так, во-первых, мы получаем список перевалы, которые содержат «тест» с помощью str.contains
:
In [142]:
df.columns[df.columns.str.contains('test')]
Out[142]:
Index(['test', 'test 1'], dtype='object')
то проверить это подмножество для NaN
значений с использованием [isnull
]:
In [143]:
df[cols].isnull()
Out[143]:
test test 1
0 True False
1 True False
2 True True
3 True False
4 True False
если w е sum
это, он преобразует логические значения в целое 1 и 0:
In [144]:
df[cols].isnull().sum()
Out[144]:
test 5
test 1 1
dtype: int64
мы можем создать булево маску, сравнивая это на половине длины ДФ:
In [145]:
df[cols].isnull().sum() > len(df)/2
Out[145]:
test True
test 1 False
dtype: bool
мы можем отфильтруйте это, чтобы получить столбцы:
In [146]:
cols[df[cols].isnull().sum() > len(df)/2]
Out[146]:
Index(['test'], dtype='object')
Это прекрасно работает - большое вам спасибо! – JoeyPython
Просто интересно, можно ли использовать подобный подход для заполнения NAN 0 (ZERO)? – JoeyPython
Вы имеете в виду ['df.fillna (0)'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html)? – EdChum
Не могли бы вы предоставить образец данных? –
На этом DF будут удалены только те тесты12 и test13: [link] http://i64.tinypic.com/hry2w7.png – JoeyPython