Pandas печатать имена столбцов пропущенных значений и только считать - PullRequest
1 голос
/ 22 января 2020

Я использую следующий код для печати счетчика пропущенных значений и имен столбцов.

#Looking for missing data and then handling it accordingly
def find_missing(data):
# number of missing values
count_missing = data_final.isnull().sum().values
# total records
total = data_final.shape[0]
# percentage of missing
ratio_missing = count_missing/total
# return a dataframe to show: feature name, # of missing and % of missing
return pd.DataFrame(data={'missing_count':count_missing, 'missing_ratio':ratio_missing}, 
index=data.columns.values)
find_missing(data_final).head(5)

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

Набор данных выглядит следующим образом

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

В выводе я просто хотел бы увидеть:

     missing_count   missing_ratio
C    4               0.66
D    4               0.66

, а не столбцы A и B, поскольку там нет пропущенных значений

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Используйте DataFrame.isna с DataFrame.sum для подсчета по столбцам . Мы также можем использовать DataFrame.isnull вместо DataFrame.isna.

new_df = (df.isna()
            .sum()
            .to_frame('missing_count')
            .assign(missing_ratio = lambda x: x['missing_count']/len(df))
            .loc[df.isna().any()] )
print(new_df)

Мы также можем использовать pd.concat вместо DataFrame.assign

count = df.isna().sum()
new_df = (pd.concat([count.rename('missing_count'),
                     count.div(len(df))
                          .rename('missing_ratio')],axis = 1)
             .loc[count.ne(0)])

Выход

   missing_count  missing_ratio
A              1       0.166667
C              4       0.666667
D              4       0.666667
1 голос
/ 22 января 2020

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

s = df.isnull().sum()
result = pd.concat([s,s/len(df)],1)
result.columns = ["missing_count","missing_ratio"]
print (result)

   missing_count  missing_ratio
A              1       0.166667
B              0       0.000000
C              4       0.666667
D              4       0.666667
1 голос
/ 22 января 2020

IIU C, мы можем присвоить пропущенное и общее количество двум переменным, сделать некоторые базовые c математические вычисления и присвоить их обратно.

a = df.isnull().sum(axis=0)

b = np.round(df.isnull().sum(axis=0) / df.fillna(0).count(axis=0),2)


missing_df = pd.DataFrame({'missing_vals' : a,
             'missing_ratio' : b})

print(missing_df)
   missing_vals  ratio
A             1   0.17
B             0   0.00
C             4   0.67
D             4   0.67

вы можете отфильтровать столбцы, в которых нет пропущенных значений

missing_df = missing_df[missing_df.missing_vals.ne(0)]
print(missing_df)
missing_vals  ratio
A             1   0.17
C             4   0.67
D             4   0.67
...