Как удалить первые n строк, которые имеют значение NaN в первом столбце?

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

Мой фрейм данных выглядит так: введите описание изображения здесьи мне нужно удалить первые 4 строки, потому что они имеют значение NaN в качестве значения в первом столбце. Поскольку мне придется делать это для немного разных фреймов данных, я не могу просто удалить их по индексу. Для достижения этой цели я подумал о переборе df по строкам, проверке, равно ли значение NaN, с помощью isnan функции numpy, а затем отбросить строку — к сожалению, это, похоже, не работает.

 first_col = df.columns[0]
for i, row in df.iterrows():
    if np.isnan(row[first_col]):
        df.drop(i, axis=0, inplace=True)
    else:
        break
 

isnan однако это не работает.
Поэтому я попытался заменить значения NaN пустой строкой df.fillna("", inplace=True) и заменил условие if:

 first_col = df.columns[0]
for i, row in df.iterrows():
    if row[first_col] == '':
        df.drop(i, inplace=True, axis=0)
    else:
        break
 

Это работает, но это довольно уродливо. Есть ли более быстрый / аккуратный способ добиться этого?

Ответ №1:

Я не могу воспроизвести ваш полный набор данных из-за способа, которым вы его разместили, но вы можете это сделать:

Предположим, что a df (который похож на ваш первый столбец):

   num.ord.tariffa
0             NaN
1             NaN
2             NaN
3             NaN
4               5
5               6
6               7
 

Вы используете .loc , и argmax() :

 new_df = df.loc[df.notnull().all(axis=1).argmax():]
 

и вернитесь:

   num.ord.tariffa
4               5
5               6
6               7
 

Который удаляется np.nan до первого non-nan , что является вашим желаемым результатом.

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

1. Мой df похож на тот, который вы использовали, но, похоже, я не могу воспроизвести этот подход на моем…

Ответ №2:

Вы можете попробовать это:

 df['num.ord.tariffa'] = df['num.ord.tariffa'].fillna('Remove')
newdf = df[df['num.ord.tariffa'] != 'Remove']
 

Редактировать:

 final = pd.DataFrame()
n = 4
for index,row in df.iterrows():
   if index < n:
        if row['c1'] == np.nan:
           pass
        else:
           new = pd.DataFrame([[row['c1'],row['c2']]],columns=['c1','c2'])
           final = final.append(new)
   else:
        new = pd.DataFrame([[row['c1'],row['c2']]],columns=['c1','c2'])
        final = final.append(new)
 

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

1. Это сработало бы, если бы мне пришлось удалить все строки со значением NaN в этом столбце. Вместо этого мне просто нужно удалить те, которые стоят перед первым допустимым значением — после пятой строки есть еще строки.

Ответ №3:

Вы должны удалить строки со значениями Nan и добавить подмножество интересующих вас столбцов:

 df = df.dropna(subset='num.ord.tariffa')