Как удалить список строк из кадра данных Pandas?

260

У меня есть датафрейм 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

Как или какая функция может это сделать?

bigbug
источник
просто чтобы прояснить, этот вопрос касается удаления строк с определенными значениями индекса. их использование [1,2,4] для указания строк, оставшихся после удаления. Ниже приведены ответы, которые делают это.
алхимия

Ответы:

388

Используйте DataFrame.drop и передайте ему серию индексных меток:

In [65]: df
Out[65]: 
       one  two
one      1    4
two      2    3
three    3    2
four     4    1


In [66]: df.drop(df.index[[1,3]])
Out[66]: 
       one  two
one      1    4
three    3    2
Теодрос Зеллеке
источник
18
+1 Кроме того, сбросить последний ряд df.drop (df.tail (1) .index)
Насер Аль-Вохайби
15
Этот ответ работает, только если df.index.unique () совпадает с df.index, что не является обязательным требованием для Pandas DataFrame. У кого-нибудь есть решение, когда значения df.index не гарантируются быть уникальными?
Джонс Джонс
2
это не позволяет вам индексировать само имя индекса
ingrid
45
Люди, в примерах, если вы хотите прояснить ситуацию, пожалуйста, не используйте одинаковые строки для строк и столбцов. Это хорошо для тех, кто действительно знает свое дело. Расстраивает тех, кто пытается учиться.
Gseattle
2
новички в python: обратите внимание, что если вы хотите отбросить эти строки и сохранить их в том же кадре данных (на месте), вам также необходимо добавить 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)
mrbTT
113

Обратите внимание, что может быть важно использовать команду «на месте», когда вы хотите сделать выпадение в строке.

df.drop(df.index[[1,3]], inplace=True)

Поскольку ваш исходный вопрос ничего не возвращает, эту команду следует использовать. http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html

user3155053
источник
47

Если DataFrame огромен, а количество отбрасываемых строк также велико, то простое удаление по индексу df.drop(df.index[])занимает слишком много времени.

В моем случае у меня есть многоиндексный DataFrame с плавающей точкой 100M rows x 3 cols, и мне нужно удалить 10kстроки из него. Самый быстрый метод, который я нашел, довольно противоречиво takeотносится к оставшимся строкам.

Позвольте indexes_to_dropбыть массив позиционных индексов для удаления ( [1, 2, 4]в вопросе).

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))

В моем случае это заняло 20.5s, а простое df.dropвзяло 5min 27sи потребило много памяти. Полученный DataFrame такой же.

Денис Голомазов
источник
43

Вы также можете перейти к DataFrame.drop на саму этикетку (вместо серии индексных меток):

In[17]: df
Out[17]: 
            a         b         c         d         e
one  0.456558 -2.536432  0.216279 -1.305855 -0.121635
two -1.015127 -0.445133  1.867681  2.179392  0.518801

In[18]: df.drop('one')
Out[18]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

Что эквивалентно:

In[19]: df.drop(df.index[[0]])
Out[19]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801
danielhadar
источник
1
df.drop (df.index [0]) также работает. я имею в виду, нет необходимости в двойных квадратных скобках (по крайней мере, с пандами 0.18.1)
tagoma
23

Я решил это проще - всего за 2 шага.

Шаг 1: Сначала сформируйте фрейм данных с нежелательными строками / данными.

Шаг 2: Используйте индекс этого нежелательного кадра данных, чтобы удалить строки из исходного кадра данных.

Пример:

Предположим, у вас есть датафрейм df, который содержит столько столбцов, включая Age, который является целым числом. Теперь предположим, что вы хотите удалить все строки с «Возрастом» в качестве отрицательного числа.

Шаг 1: df_age_negative = df [df ['Age'] <0]

Шаг 2: df = df.drop (df_age_negative.index, axis = 0)

Надеюсь, что это намного проще и поможет вам.

Кришнапрасад Чаллуру
источник
1
+1, это единственный ответ, который говорит вам, как удалить строку, выбрав столбец, отличный от первого.
Алехо Бернардин
10

Если я хочу удалить строку с индексом x, скажем , я бы сделал следующее:

df = df[df.index != x]

Если бы я хотел отбросить несколько индексов (скажем, эти индексы есть в списке unwanted_indices), я бы сделал:

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]
Divyansh
источник
6

Вот немного конкретный пример, который я хотел бы показать. Скажем, у вас есть много повторяющихся записей в некоторых ваших строках. Если у вас есть строковые записи, вы можете легко использовать строковые методы, чтобы найти все индексы для удаления.

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

А теперь отбросить эти строки, используя их индексы

new_df = df.drop(ind_drop)
кибер-математика
источник
3

В комментарии к ответу @ theodros-zelleke @ j-jones спросил, что делать, если индекс не уникален. Мне пришлось иметь дело с такой ситуацией. Что я сделал, так это переименовал дубликаты в индексе перед тем, как позвонил drop():

dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)

где rename_duplicates()- определенная мной функция, которая прошла через элементы индекса и переименовала дубликаты. Я использовал тот же шаблон переименования, что и pd.read_csv()для столбцов, т. Е. "%s.%d" % (name, count)Где name- имя строки и countсколько раз это происходило ранее.

mepstein
источник
1

Определение индекса из логического значения, как описано выше, например

df[df['column'].isin(values)].index

может быть больше памяти, чем определение индекса с помощью этого метода

pd.Index(np.where(df['column'].isin(values))[0])

применяется так

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

Этот метод полезен при работе с большими кадрами данных и ограниченным объемом памяти.

Адам Зельдин
источник
0

Используйте только аргумент Index для удаления строки: -

df.drop(index = 2, inplace = True)

Для нескольких рядов: -

df.drop(index=[1,3], inplace = True)
Камран Каусар
источник
0

Рассмотрим пример dataframe

df =     
index    column1
0           00
1           10
2           20
3           30

мы хотим удалить 2-ю и 3-ю индексные строки.

Подход 1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

Подход 2

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
материк
источник