При удалении столбца в DataFrame я использую:

del df['column_name']

И это прекрасно работает. Почему я не могу использовать следующее?

del df.column_name

Поскольку вы можете получить доступ к столбцу / серии как df.column_name, я ожидаю, что это сработает.

1547
John 16 Ноя 2012 в 10:26

10 ответов

Лучший ответ

Как вы уже догадались, правильный синтаксис

del df['column_name']

Трудно заставить del df.column_name работать просто из-за синтаксических ограничений в Python. del df[name] переводится на df.__delitem__(name) под прикрытием Python.

776
cs95 7 Апр 2019 в 22:01

Еще один способ удаления столбца в Pandas DataFrame

Если вы не ищете удаление на месте, то вы можете создать новый DataFrame, указав столбцы с помощью функции DataFrame(...) как

my_dict = { 'name' : ['a','b','c','d'], 'age' : [10,20,25,22], 'designation' : ['CEO', 'VP', 'MD', 'CEO']}

df = pd.DataFrame(my_dict)

Создайте новый DataFrame как

newdf = pd.DataFrame(df, columns=['name', 'age'])

Вы получаете такой же хороший результат, как и результат del / drop

1
Daksh 9 Сен 2018 в 06:59

Падение по индексу

Удалить первый, второй и четвертый столбцы:

df.drop(df.columns[[0,1,3]], axis=1, inplace=True)

Удалить первый столбец:

df.drop(df.columns[[0]], axis=1, inplace=True)

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

Popped

Выбор, добавление, удаление столбцов

Удалить столбец column-name:

df.pop('column-name')

Примеры:

df = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]), ('C', [7,8, 9])], orient='index', columns=['one', 'two', 'three'])

print df :

   one  two  three
A    1    2      3
B    4    5      6
C    7    8      9

df.drop(df.columns[[0]], axis=1, inplace=True) print df :

   two  three
A    2      3
B    5      6
C    8      9

three = df.pop('three') print df :

   two
A    2
B    5
C    8
104
Peter Mortensen 23 Май 2018 в 19:44

Лучший способ сделать это в пандах - это использовать {{ X0 } } :

df = df.drop('column_name', 1)

Где 1 - это число оси (0 для строк и 1 для столбцов.)

Чтобы удалить столбец без переназначения df, вы можете сделать:

df.drop('column_name', axis=1, inplace=True)

Наконец, чтобы удалить столбец номер вместо столбца метка , попробуйте удалить его, например. 1-й, 2-й и 4-й столбцы:

df = df.drop(df.columns[[0, 1, 3]], axis=1)  # df.columns is zero-based pd.Index 

Также работает с «текстовым» синтаксисом для столбцов:

df.drop(['column_nameA', 'column_nameB'], axis=1, inplace=True)
2022
PV8 20 Ноя 2019 в 09:53

Приятным дополнением является возможность отбрасывать столбцы, только если они существуют . Таким образом, вы можете охватить больше вариантов использования, и он удалит только существующие столбцы из меток, переданных ему:

Просто добавьте errors = 'ignore' , например:

df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
  • Это новинка от панд 0.16.1 и выше. Документация находится здесь.
55
Peter Mortensen 23 Май 2018 в 19:48

С версии 0.16.1 вы можете сделать

df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore')
41
Emile Bergeron 21 Окт 2016 в 21:20

Рекомендуется всегда использовать нотацию []. Одна из причин заключается в том, что обозначение атрибута (df.column_name) не работает для пронумерованных индексов:

In [1]: df = DataFrame([[1, 2, 3], [4, 5, 6]])

In [2]: df[1]
Out[2]:
0    2
1    5
Name: 1

In [3]: df.1
  File "<ipython-input-3-e4803c0d1066>", line 1
    df.1
       ^
SyntaxError: invalid syntax
30
Peter Mortensen 23 Май 2018 в 19:43

Использование:

columns = ['Col1', 'Col2', ...]
df.drop(columns, inplace=True, axis=1)

Это удалит один или несколько столбцов на месте. Обратите внимание, что inplace=True был добавлен в pandas v0.13 и не будет работать в более старых версиях. Вы должны были бы присвоить результат обратно в этом случае:

df = df.drop(columns, axis=1)
230
Peter Mortensen 23 Май 2018 в 19:44

Панды 0.21+ ответ

Версия Pandas 0.21 изменила drop метод немного включает в себя оба параметра index и columns для соответствия сигнатуре методов rename и reindex.

df.drop(columns=['column_a', 'column_c'])

Лично я предпочитаю использовать параметр axis для обозначения столбцов или индекса, поскольку это основной параметр ключевого слова, используемый почти во всех методах панд. Но теперь у вас есть несколько добавленных вариантов в версии 0.21.

24
Acumenus 20 Сен 2018 в 18:48

В пандах 0.16.1+ вы можете отбрасывать столбцы, только если они существуют в соответствии с решением, опубликованным @eiTanLaVi. До этой версии вы можете достичь того же результата с помощью понимания условного списка:

df.drop([col for col in ['col_name_1','col_name_2',...,'col_name_N'] if col in df], 
        axis=1, inplace=True)
20
Alexander 22 Ноя 2016 в 15:15