Определяемая пользователем функция в Python для обнаружения пропущенных значений в Python? - PullRequest
1 голос
/ 17 октября 2019
    ST_NUM    ST_NAME     OWN_OCCUPIED  NUM_BEDROOMS
0   104.0     PUTNAM            Y           3.0
1   197.0    LEXINGTON         NaN          NaN
2     NaN    LEXINGTON          N           3.0
3   201.0    BERKELEY          NaN          1.0
4   203.0    BERKELEY           Y           NaN

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

вывод df должен выглядеть следующим образом.

col_name index st_num 2 st_num 6 st_name 8 Num_bedrooms 2 Num_bedrooms 5 Num_bedrooms 7 Num_bedrooms 8 .......

Ответы [ 2 ]

3 голосов
/ 17 октября 2019

Вы можете нарезать индекс на isnull для каждого столбца, чтобы получить индексы. Также возможно с укладкой и групповым.

def summarize_missing(df):
    # Null counts
    s1 = df.isnull().sum().rename('No. Missing')

    s2 = pd.Series(data=[df.index[m].tolist() for m in [df[col].isnull() for col in df.columns]],
                   index=df.columns,
                   name='Index')
    # Other way, probably overkill
    #s2 = (df.isnull().replace(False, np.NaN).stack().reset_index()
    #         .groupby('level_1')['level_0'].agg(list)
    #         .rename('Index'))

    return pd.concat([s1, s2], axis=1, sort=False)


summarize_missing(df)
#              No. Missing   Index
#ST_NUM                  1     [2]
#ST_NAME                 0     NaN
#OWN_OCCUPIED            2  [1, 3]
#NUM_BEDROOMS            2  [1, 4]
0 голосов
/ 17 октября 2019

Вот еще один способ:

m = df.isna().sum().to_frame().rename(columns={0: 'No. Missing'})
m['index'] = m.index.map(lambda x: ','.join(map(str, df.loc[df[x].isna()].index.values)))

print(m)
              No. Missing index
ST_NUM                  1     2
ST_NAME                 0      
OWN_OCCUPIED            2   1,3
NUM_BEDROOMS            2   1,4
...