#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')