Подтвердить что ты не робот

Pandas столбцы данных сбрасываются по числу нан

У меня есть dataframe с некоторыми столбцами, содержащими nan. Я бы хотел удалить эти столбцы с определенным количеством нанов. Например, в следующем коде я хотел бы удалить любой столбец с 2 или более нано. В этом случае столбец "C" будет удален, и будут сохраняться только "A" и "B". Как его реализовать?

import pandas as pd
import numpy as np

dff = pd.DataFrame(np.random.randn(10,3), columns=list('ABC'))
dff.iloc[3,0] = np.nan
dff.iloc[6,1] = np.nan
dff.iloc[5:8,2] = np.nan

print dff
4b9b3361

Ответ 1

Существует параметр thresh для dropna, вам просто нужно передать длину вашего df - число NaN значения в качестве порога:

In [13]:

dff.dropna(thresh=len(dff) - 2, axis=1)
Out[13]:
          A         B
0  0.517199 -0.806304
1 -0.643074  0.229602
2  0.656728  0.535155
3       NaN -0.162345
4 -0.309663 -0.783539
5  1.244725 -0.274514
6 -0.254232       NaN
7 -1.242430  0.228660
8 -0.311874 -0.448886
9 -0.984453 -0.755416

Таким образом, вышесказанное поместит любой столбец, который не соответствует критериям длины df (количество строк) - 2 как число значений, отличных от Na.

Ответ 2

Вы можете использовать понимание условного списка:

>>> dff[[c for c in dff if dff[c].isnull().sum() < 2]]
          A         B
0 -0.819004  0.919190
1  0.922164  0.088111
2  0.188150  0.847099
3       NaN -0.053563
4  1.327250 -0.376076
5  3.724980  0.292757
6 -0.319342       NaN
7 -1.051529  0.389843
8 -0.805542 -0.018347
9 -0.816261 -1.627026

Ответ 3

Вот возможное решение:

s = dff.isnull().apply(sum, axis=0) # count the number of nan in each column
print s
   A    1 
   B    1
   C    3
   dtype: int64

for col in dff: 
   if s[col] >= 2:  
       del dff[col]

Или

for c in dff:
    if sum(dff[c].isnull()) >= 2:
        dff.drop(c, axis=1, inplace=True)

Ответ 4

Я рекомендую drop -метод. Это альтернативное решение:

dff.drop(dff.loc[:,len(dff) - dff.isnull().sum() <2], axis=1)

Ответ 5

Скажем, вы должны отбросить столбцы, имеющие более 70% нулевых значений.

data.drop(data.loc[:,list((100*(data.isnull().sum()/len(data.index))>70))].columns, 1)