При удалении столбца в DataFrame я использую:
del df['column_name']
И это прекрасно работает. Почему я не могу использовать следующее?
del df.column_name
Поскольку можно получить доступ к столбцу / серии как df.column_name
, я ожидал, что это сработает.
Ответы:
Как вы уже догадались, правильный синтаксис
Трудно заставить
del df.column_name
работать просто из-за синтаксических ограничений в Python.del df[name]
переводится наdf.__delitem__(name)
под прикрытием Python.источник
class A(object): def __init__(self): self.var = 1
устанавливает класс, затемa = A(); del a.var
работает просто отлично ...del df[name]
, он получает перевод,df.__delitem__(name)
который представляет собой метод, который DataFrame может реализовать и изменить в соответствии со своими потребностями. В случаеdel df.name
, переменная-член удаляется без каких-либо шансов на выполнение какого-либо пользовательского кода. Рассмотрите свой собственный пример - можете ли вы получитьdel a.var
результат «удаления переменной»? Если можешь, расскажи как. Я не могу :)pandas
разработчики не сделали этого , но это не значит, что это трудно сделать.Лучший способ сделать это в пандах - это использовать
drop
:где
1
есть ось число (0
для строк и1
столбцов.)Чтобы удалить столбец без переназначения,
df
вы можете сделать:Наконец, чтобы упасть по номеру столбца, а не по метке столбца , попробуйте это удалить, например, 1-й, 2-й и 4-й столбцы:
Также работает с «текстовым» синтаксисом для столбцов:
источник
del
по какой-то причине?drop
overdel
является то, чтоdrop
вы можете отбрасывать несколько столбцов одновременно, выполнять операцию на месте или нет, а также удалять записи вдоль любой оси (особенно полезно для трехмерной матрицы илиPanel
)drop
надdel
том , что падение является частью панд API и содержит документацию.Использование:
Это удалит один или несколько столбцов на месте. Обратите внимание, что он
inplace=True
был добавлен в pandas v0.13 и не будет работать на старых версиях. Вы должны были бы присвоить результат обратно в этом случае:источник
df.drop(list,inplace=True,axis=1)
del
- он может отбрасывать более одного столбца одновременно.Падение по индексу
Удалить первый, второй и четвертый столбцы:
Удалить первый столбец:
Существует необязательный параметр
inplace
, позволяющий изменять исходные данные без создания копии.Popped
Выбор, добавление, удаление столбцов
Удалить столбец
column-name
:Примеры:
print df
:df.drop(df.columns[[0]], axis=1, inplace=True)
print df
:three = df.pop('three')
print df
:источник
df.T.pop('A')
df
. Вы могли бы сделать,df = df.T; df.pop(index); df = df.T
но это кажется чрезмерным.df.drop(df.columns[[0]], axis=1, inplace=True)
чтобы не было достаточно использоватьdf.drop([0], axis=1)
?0
, тоdf.drop(0, axis=1)
работает хорошо. Но если вы не знаете имя столбца иdf.drop(df.columns[[0]], axis=1, inplace=True)
хотите удалить первый столбец, тогда нужно выбрать первый столбец по позиции и отбросить его.Фактический вопрос, который пропущен большинством ответов здесь:
Почему я не могу использовать
del df.column_name
?Сначала нам нужно понять проблему, которая требует от нас погрузиться в магические методы Python .
Как Уэс указывает в своем ответе, он
del df['column']
отображает магический метод питона,df.__delitem__('column')
который реализован в пандах для удаления столбца.Однако, как указано в ссылке выше о магических методах Python :
Вы можете утверждать, что
del df['column_name']
не должны использоваться или поощряться, и, следовательно,del df.column_name
не должны даже рассматриваться.Однако, в теории,
del df.column_name
можно было бы implemeted работать в панд , используя в метод волшебной__delattr__
. Это, однако, создает определенные проблемы, проблемы, которыеdel df['column_name']
уже есть у реализации, но в меньшей степени.Пример задачи
Что, если я определю столбец в кадре данных, который называется «dtypes» или «columns».
Тогда предположим, что я хочу удалить эти столбцы.
del df.dtypes
может привести к__delattr__
путанице в методе, как если бы он удалил атрибут "dtypes" или столбец "dtypes".Архитектурные вопросы, стоящие за этой проблемой
Панды отвечает:
.ix
,.loc
или.iloc
.TLDR;
Вы не можете этого сделать,
del df.column_name
потому что у pandas довольно дико развитая архитектура, которую необходимо пересмотреть, чтобы такого рода когнитивный диссонанс не возникал у пользователей.Protip:
Не используйте df.column_name, это может быть красиво, но это вызывает когнитивный диссонанс
Цитаты Zen of Python, которые здесь вписываются:
Существует несколько способов удаления столбца.
Столбцы иногда являются атрибутами, но иногда нет.
Есть ли
del df.dtypes
удалить атрибут dtypes или столбец dtypes?источник
__del__
почти никогда не следует использовать из-за сомнительных обстоятельств, при которых он вызывается; используйте его с осторожностью!» здесь совершенно не имеет значения, так как используемый здесь метод__delattr__
.del
встроенная , что имеется в виду, а не.__del__
метод экземпляра.del
Встроенная команда отображение на__delattr__
и__delitem__
что то , что я строю свой аргумент на. Так что, может быть, вы хотите перечитать то, что я написал.__
...__
получает StackExchange как смелую разметкуПриятным дополнением является возможность отбрасывать столбцы, только если они существуют . Таким образом, вы можете охватить больше вариантов использования, и он удалит только существующие столбцы из меток, переданных ему:
Просто добавьте ошибки = игнорировать , например:
источник
с версии 0.16.1 вы можете сделать
источник
errors= 'ignore'
)df.drop(['column_1','column_2'], axis=1 , inplace=True,errors= 'ignore')
, если такое приложение желательно!Хорошей практикой всегда является использование
[]
обозначений. Одна из причин заключается в том, что атрибут notation (df.column_name
) не работает для пронумерованных индексов:источник
Панды 0.21+ ответ
Панды версия 0,21 изменила
drop
немного способа включать какindex
иcolumns
параметры соответствуют Сигнатуреrename
иreindex
методов.Лично я предпочитаю использовать
axis
параметр для обозначения столбцов или индекса, поскольку это основной параметр ключевого слова, используемый почти во всех методах панд. Но теперь у вас есть несколько добавленных вариантов в версии 0.21.источник
В pandas 0.16.1+ вы можете отбрасывать столбцы, только если они существуют в соответствии с решением, опубликованным @eiTanLaVi. До этой версии вы можете достичь того же результата с помощью понимания условного списка:
источник
TL; DR
Много усилий, чтобы найти чуть более эффективное решение. Трудно оправдать добавленную сложность, жертвуя простотой
df.drop(dlst, 1, errors='ignore')
Преамбула
Удаление столбца семантически аналогично выбору других столбцов. Я покажу несколько дополнительных методов для рассмотрения.
Я также сосредоточусь на общем решении удаления нескольких столбцов одновременно и разрешения попытки удалить столбцы, которых нет.
Использование этих решений носит общий характер и будет работать и для простого случая.
Настройка
Рассмотрите
pd.DataFrame
df
и список для удаленияdlst
Результат должен выглядеть так:
Поскольку я приравниваю удаление столбца к выбору других столбцов, я разделю его на два типа:
Выбор метки
Мы начнем с изготовления списка / массива меток, которые представляют столбцы, которые мы хотим сохранить, и без столбцов, которые мы хотим удалить.
df.columns.difference(dlst)
np.setdiff1d(df.columns.values, dlst)
df.columns.drop(dlst, errors='ignore')
list(set(df.columns.values.tolist()).difference(dlst))
[x for x in df.columns.values.tolist() if x not in dlst]
Столбцы из ярлыков
Для сравнения процесса выбора предположим:
Тогда мы можем оценить
df.loc[:, cols]
df[cols]
df.reindex(columns=cols)
df.reindex_axis(cols, 1)
Которые все оценивают:
Логический ломтик
Мы можем построить массив / список логических значений для нарезки
~df.columns.isin(dlst)
~np.in1d(df.columns.values, dlst)
[x not in dlst for x in df.columns.values.tolist()]
(df.columns.values[:, None] != dlst).all(1)
Колонны от Boolean
Для сравнения
df.loc[: bools]
Которые все оценивают:
Надежные сроки
функции
тестирование
Это относительно времени, которое требуется для запуска
df.drop(dlst, 1, errors='ignore')
. Кажется, что после всех этих усилий мы лишь незначительно улучшаем производительность.Если факт, то лучшие решения использовать
reindex
илиreindex_axis
взломатьlist(set(df.columns.values.tolist()).difference(dlst))
. Близкая секунда и все же очень незначительно лучше, чемdrop
естьnp.setdiff1d
.источник
Точечный синтаксис работает в JavaScript, но не в Python.
del df['column_name']
del df['column_name']
илиdel df.column_name
источник
Если ваш исходный фрейм данных
df
не слишком большой, у вас нет ограничений памяти, и вам нужно всего лишь сохранить несколько столбцов, тогда вы можете также создать новый фрейм данных только с нужными вам столбцами:источник
Мы можем удалить или удалить указанный столбец или расширенные столбцы методом drop () .
Предположим, что df является фреймом данных.
Удаляемый столбец = column0
Удалить несколько столбцов col1, col2,. , , Колон, мы должны вставить все столбцы, которые должны быть удалены в списке. Затем удалите их методом drop ().
Я надеюсь, что это будет полезно.
источник
df = df.drop([col1, col2, . . . , coln], axis=1)
это не работает, если я указываю имя переменной вместо col1, col2 и т. д. Я получаю столбец ошибки не по оси, когда он определенно присутствует. @ Литтин Не могли бы вы помочь?Еще один способ удаления столбца в Pandas DataFrame
если вы не ищете удаление на месте, то вы можете создать новый DataFrame, указав столбцы, используя
DataFrame(...)
функцию какСоздайте новый DataFrame как
Вы получаете такой же хороший результат, как и результат del / drop
источник