2016-05-26 12 views
2

У меня есть большой кадр данных pandas [df] с сотнями имен столбцов. Я хочу удалить все столбцы с более чем 50% значениями NAN, но только те столбцы, которые имеют слово «test» в заголовке столбцов. Есть ли простой способ сделать это? & благодарю вас за помощь!Отбрасывать столбцы с похожими именами с более чем 50% nan в pandas

+1

Не могли бы вы предоставить образец данных? –

+0

На этом DF будут удалены только те тесты12 и test13: [link] http://i64.tinypic.com/hry2w7.png – JoeyPython

ответ

4

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') 
+0

Это прекрасно работает - большое вам спасибо! – JoeyPython

+0

Просто интересно, можно ли использовать подобный подход для заполнения NAN 0 (ZERO)? – JoeyPython

+0

Вы имеете в виду ['df.fillna (0)'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html)? – EdChum