У меня есть датафрейм df:
>>> df
sales discount net_sales cogs
STK_ID RPT_Date
600141 20060331 2.709 NaN 2.709 2.245
20060630 6.590 NaN 6.590 5.291
20060930 10.103 NaN 10.103 7.981
20061231 15.915 NaN 15.915 12.686
20070331 3.196 NaN 3.196 2.710
20070630 7.907 NaN 7.907 6.459
Затем я хочу удалить строки с определенными порядковыми номерами, указанными в списке, предположим, что здесь [1,2,4],
осталось:
sales discount net_sales cogs
STK_ID RPT_Date
600141 20060331 2.709 NaN 2.709 2.245
20061231 15.915 NaN 15.915 12.686
20070630 7.907 NaN 7.907 6.459
Как или какая функция может это сделать?
Ответы:
Используйте DataFrame.drop и передайте ему серию индексных меток:
источник
axis=0
(0 = строки, 1 = столбцы) иinplace=True
как вdf.drop(df.index[[1,3]], axis=0, inplace=True)
. @mezzanaccio, если вы точно знаете, какие индексы вы хотите заменить (а также на примере с 0 по n):df.drop(df.index[range(0, n)], axis=0, inplace=True)
Обратите внимание, что может быть важно использовать команду «на месте», когда вы хотите сделать выпадение в строке.
Поскольку ваш исходный вопрос ничего не возвращает, эту команду следует использовать. http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html
источник
Если DataFrame огромен, а количество отбрасываемых строк также велико, то простое удаление по индексу
df.drop(df.index[])
занимает слишком много времени.В моем случае у меня есть многоиндексный DataFrame с плавающей точкой
100M rows x 3 cols
, и мне нужно удалить10k
строки из него. Самый быстрый метод, который я нашел, довольно противоречивоtake
относится к оставшимся строкам.Позвольте
indexes_to_drop
быть массив позиционных индексов для удаления ([1, 2, 4]
в вопросе).В моем случае это заняло
20.5s
, а простоеdf.drop
взяло5min 27s
и потребило много памяти. Полученный DataFrame такой же.источник
Вы также можете перейти к DataFrame.drop на саму этикетку (вместо серии индексных меток):
Что эквивалентно:
источник
Я решил это проще - всего за 2 шага.
Шаг 1: Сначала сформируйте фрейм данных с нежелательными строками / данными.
Шаг 2: Используйте индекс этого нежелательного кадра данных, чтобы удалить строки из исходного кадра данных.
Пример:
Предположим, у вас есть датафрейм df, который содержит столько столбцов, включая Age, который является целым числом. Теперь предположим, что вы хотите удалить все строки с «Возрастом» в качестве отрицательного числа.
Шаг 1: df_age_negative = df [df ['Age'] <0]
Шаг 2: df = df.drop (df_age_negative.index, axis = 0)
Надеюсь, что это намного проще и поможет вам.
источник
Если я хочу удалить строку с индексом
x
, скажем , я бы сделал следующее:Если бы я хотел отбросить несколько индексов (скажем, эти индексы есть в списке
unwanted_indices
), я бы сделал:источник
Вот немного конкретный пример, который я хотел бы показать. Скажем, у вас есть много повторяющихся записей в некоторых ваших строках. Если у вас есть строковые записи, вы можете легко использовать строковые методы, чтобы найти все индексы для удаления.
А теперь отбросить эти строки, используя их индексы
источник
В комментарии к ответу @ theodros-zelleke @ j-jones спросил, что делать, если индекс не уникален. Мне пришлось иметь дело с такой ситуацией. Что я сделал, так это переименовал дубликаты в индексе перед тем, как позвонил
drop()
:где
rename_duplicates()
- определенная мной функция, которая прошла через элементы индекса и переименовала дубликаты. Я использовал тот же шаблон переименования, что иpd.read_csv()
для столбцов, т. Е."%s.%d" % (name, count)
Гдеname
- имя строки иcount
сколько раз это происходило ранее.источник
Определение индекса из логического значения, как описано выше, например
может быть больше памяти, чем определение индекса с помощью этого метода
применяется так
Этот метод полезен при работе с большими кадрами данных и ограниченным объемом памяти.
источник
Используйте только аргумент Index для удаления строки: -
Для нескольких рядов: -
источник
Рассмотрим пример dataframe
мы хотим удалить 2-ю и 3-ю индексные строки.
Подход 1:
Подход 2
источник