Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Удаление строк DataFrame, содержащих NaN в определенном столбце

#python #pandas #dataframe #nan


Необходимо удалить все строки DataFrame, где значение столбца filename равно NaN. 
Код:
for n in range(len(df_common_fin)):
    if df_common_fin.iloc[n, 'filename'] == np.nan:
        df_common_fin.drop(index=n)

не работает, хотя прохожу по порядковым индексам iloc. Выдается ошибка:


  ValueError: Location based indexing can only have [integer, integer slice (START
point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types


такой код:

for n in range(len(df_common_fin)):
if df_common_fin['filename'][n] == np.nan:
    df_common_fin.drop(index=n,axis=0)


так же выдаешь ошибку:


  KeyError: 0

    


Ответы

Ответ 1



Воспользуйтесь методом DataFrame.dropna(subset=['colX','colY']): df_common_fin = df_common_fin.dropna(axis='index', how='any', subset=['filename']) Ошибка в вашем коде вызвана тем что "accessor" df.iloc[] воспринимает только позиционные аргументы, как для индекса, так и для столбцов. Т.е. df_common_fin.iloc[n, 'filename'] надо переписать так: df_common_fin.iloc[n, ] Следующая проблема, которая бы у вас возникла это: np.nan != np.nan - как следствие конструкция if ... всегда была бы ложной: In [139]: np.nan == np.nan Out[139]: False In [140]: np.nan != np.nan Out[140]: True т.е. одна "неопределенность" не обязательно равна другой "неопределенности". Поэтому в Pandas существуют функции для работы с NaN: pd.isna, pd.isnull pd.nontna, pd.notnull DataFrame.isna, DataFrame.isnull DataFrame.notna, DataFrame.notnull DataFrame.dropna

Комментариев нет:

Отправить комментарий