Удалить строки в DataFrame удовлетворяющие условию
Как удалить строки в Pandas DataFrame, в которых значения в столбце STP == 1005092 ? Подробно: Я занимаюсь обработкой данных в Jupyter notebook : нормальное распределение, спектрограммы, гистограммы и тп. У меня есть 1500 тысячи проиндексированных массивов внутри одного файла (Индекс »STP»). Есть 2 массива которые не подходят по показаниям (явно выделяются из остальных 1498 значений), но проходят тест на нормальное распределение, из-за чего не фильтруются программой. Я пробовал команды data.STP.remove(1005072) , где семизначное число — это индекс массива, но все тщетно. Код:
cols = ['ttt','IK05','IK06','IK07','IK08','IK10','IK11','IK14','IK16','IK20','DA05','DA06','DA07','DA08','DA10','DA11','DA14','DA16', 'DA20', 'GZ1','GZ2','GZ3','GZ4', 'LLS', 'LLD', 'STP'] def lasread (fname): data = pd.read_table(fname, delim_whitespace = True,na_values = '-999.25', index_col=False) return data[cols] data = None for name in las: print(name) if data is None: data = lasread (name) else: data = pd.concat([data, lasread (name)]) ndata = data.STP.as_matrix(columns=None) df = data[cols] df1 = df.groupby('STP') df1.head() dfp = pd.DataFrame() for name, group in df1: k,p=stats.mstats.normaltest(group[5:-5]) dfp[name] = p d=dfp.transpose() d.columns = cols goodindex = d[d.IK20>0.05][d.DA20>0.05].index - отбраковка по СКО **data.STP.remove(1005072)** filtereddata = data[cols][data.STP == -39] for f in goodindex: a = data[cols][data.STP == f] filtereddata = pd.concat([filtereddata, a]) print(filtereddata)
Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
задан 18 фев 2018 в 9:59
Георгий Москалев Георгий Москалев
73 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
Как удалить строки в Pandas DataFrame на основе условия
Мы можем использовать следующий синтаксис для удаления строк в pandas DataFrame на основе условия:
Метод 1: удаление строк на основе одного условия
df = df[df.col1 > 8]
Метод 2: удаление строк на основе нескольких условий
df = df[(df.col1 > 8) & (df.col2 != 'A')]
Примечание.Мы также можем использовать функцию drop() для удаления строк из DataFrame, но эта функция оказалась намного медленнее, чем простое присвоение DataFrame отфильтрованной версии самого себя.
В следующих примерах показано, как использовать этот синтаксис на практике со следующими пандами DataFrame:
import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame df team pos assists rebounds 0 A G 5 11 1 A G 7 8 2 A F 7 10 3 A F 9 6 4 B G 12 6 5 B G 9 5 6 B F 9 9 7 B F 4 12
Метод 1: удаление строк на основе одного условия
В следующем коде показано, как удалять строки в DataFrame на основе одного условия:
#drop rows where value in 'assists' column is less than or equal to 8 df = df[df.assists > 8] #view updated DataFrame df team pos assists rebounds 3 A F 9 6 4 B G 12 6 5 B G 9 5 6 B F 9 9
Любая строка, которая имела значение меньше или равное 8 в столбце «помощь», была удалена из DataFrame.
Метод 2: удаление строк на основе нескольких условий
В следующем коде показано, как удалять строки в DataFrame на основе нескольких условий:
#only keep rows where 'assists' is greater than 8 and rebounds is greater than 5 df = df[(df.assists > 8) & (df.rebounds > 5)] #view updated DataFrame df team pos assists rebounds 3 A F 9 6 4 B G 12 6 5 B G 9 5 6 B F 9 9
Единственные строки, которые мы сохранили в DataFrame, были те, в которых значение помощи было больше 8, а значение подбора больше 5.
Обратите внимание, что мы также можем использовать | оператор для применения фильтра «или»:
#only keep rows where 'assists' is greater than 8 or rebounds is greater than 10 df = df[(df.assists > 8) | (df.rebounds > 10)] #view updated DataFrame df team pos assists rebounds 0 A G 5 11 3 A F 9 6 4 B G 12 6 5 B G 9 5 6 B F 9 9 7 B F 4 12
Единственные строки, которые мы сохранили в DataFrame, были те, в которых значение помощи было больше 8 или значение подбора было больше 10.
Все строки, не соответствующие одному из этих условий, удалялись.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:
Как из Pandas Dataframe удалить строку?
Pandas представляет нам отличные инструменты для обработки данных, в том числе для удаления той информации, которая нам не нужна. В этой статье мы рассмотрим различные способы удаления строк из Dataframe Pandas.

Создадим учебный Dataframe с описанием городов России, с которым мы будем в дальнейшем работать:
import pandas as pd
city_data = ‘Город’:[‘Москва’, ‘Казань’, ‘Владивосток’, ‘Санкт-Петербург’, ‘Калининград’],
‘Дата основания’:[‘1147’, ‘1005’, ‘1860’, ‘1703’, ‘1255’],
‘Площадь’:[‘2511’, ‘516’, ‘331’, ‘1439’, ‘223’],
‘Население’:[‘11,9’, ‘1,2’, ‘0,6’, ‘4,9’, ‘0,4’],
‘Погода’:[‘8’, ‘8’, ’17’, ‘9’, ’12’] >
city_df = pd.DataFrame(city_data)
city_df
В Pandas для удаления строк, а также столбцов используется метод drop. Его синтаксис следующий (обратите внимание, что необязательно использовать все параметры, можно только те, которые необходимы нам):
drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=’raise’), где:
- labels – номера или названия столбцов для удаления
- axis – значение 0, если вы хотите удалить строки, либо 1, если планируете удалять столбцы
- index – определяет, какие строки надо удалить
- columns – определяет, какие столбцы надо удалить
- inplace – изменяет оригинальный Dataframe, если параметр равен True
- errors – игнорируются ошибки, если параметр задан как ignore
Способ 1. Удаление строки в Pandas по ее индексу
Для каждой строки в Dataframe Pandas присваивает индекс, обычно это число. В нашем учебном Dataframe, к примеру, у Москвы индекс 0, а у Калининграда 4. Давайте уберем запись с Владивостоком:
city_df.drop(labels = [2],axis = 0)
Мы можем удалить несколько строк, перечислив их индексы через запятую в квадратных скобках:
city_df.drop(labels = [2,3],axis = 0)
Обратите внимание, что по умолчанию метод drop не изменяет исходный dataframe, если вы хотите, что бы это было сделано, добавьте параметр inplace=True
city_df.drop(labels = [4],axis = 0, inplace = True)
Способ 2. Удаление строки в Pandas по ее содержанию
Предположим, нам надо убрать строку с названием города «Казань», но мы не знаем его индекса и хотим ее удалить по названию. Для этого мы должны сначала изменить столбец с индексами и вместо цифровых значений задать данные из столбца «Город»:
city_df = city_df.set_index(‘Город’)
city_df
Теперь, когда в качестве индексов у нас названия городов, мы можем выполнить поставленную перед нами задачу:
city_df.drop([‘Казань’],axis = 0)
Мы можем удалить несколько строк по их содержанию в Pandas, перечислив их через запятую в квадратных скобках:
city_df.drop([‘Казань’,’Владивосток’],axis = 0)
Способ 3. Удаление строки в Pandas по условию
При помощи метода loc мы можем удалять строки по условию, к примеру мы хотим убрать из Dataframe те города, у которых площадь меньше 1 000 км2.
Так как мы будем применять математические условия, то сначала столбец «Площадь» мы должны перевести в формат int64:
city_df[‘Площадь’] = pd.to_numeric(city_df[‘Площадь’])
city_df[‘Площадь’]
Далее при помощи метода loc мы передадим в Dataframe отфильтрованные строки, а именно те, которые удовлетворяют условию, что Площадь > 1 000 км2
city_df = city_df.loc[city_df[‘Площадь’] > 1000]
city_df
Спасибо за внимание. Дочитавшим до конца – традиционный бонус, наш ноутбук по этой статье.
P.S. Рекомендую еще ознакомиться с нашей статьей «Как из Pandas удалить столбец?».
Удаление строк из DataFrame на основе условного выражения в Pandas
Часто возникает необходимость удалить определенные строки из DataFrame в Pandas на основе определенных условий. Например, представим, что у нас есть DataFrame, и мы хотим удалить строки, в которых длина строки в определенном столбце превышает 2.
import pandas as pd data = df = pd.DataFrame(data)
В этом DataFrame мы хотим удалить строки из column1 , где длина строки больше 2. В первую очередь, кажется логичным использовать следующий код для достижения этой цели:
df[(len(df['column1']) < 2)]
Однако, выполнение этого кода приведет к ошибке KeyError: ‘no item named False’ .
Почему возникает ошибка?
Ошибка происходит потому, что len(df[‘column1’]) возвращает количество строк в столбце, а не длину каждой отдельной строки в столбце. Поэтому, условное выражение (len(df[‘column1’]) < 2) возвращает либо True , либо False , вместо серии булевых значений.
Как правильно удалять строки на основе условного выражения?
Для удаления строк из DataFrame на основе условного выражения нужно использовать метод apply() вместе с лямбда-функцией. Вот как это можно сделать:
df = df[df['column1'].apply(lambda x: len(x) <= 2)]
После выполнения этого кода, DataFrame будет содержать только те строки, в которых длина строки в column1 меньше или равна 2.