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

У меня есть dataframe 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

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

Ответ 1

Используйте 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

Ответ 2

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

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

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

Ответ 3

Вы также можете передать 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

Ответ 4

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

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

Пусть indexes_to_drop - это массив позиционных индексов для 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 тот же.

Ответ 5

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

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

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

Пример:

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

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

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

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

Ответ 6

Если я хочу удалить строку, в которой указан индекс 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]

Ответ 7

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

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

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

new_df = df.drop(ind_drop)

Ответ 8

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

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 - сколько раз это произошло ранее.

Ответ 9

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

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)

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

Ответ 10

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

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

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

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