Как удалить список строк из 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)