При удалении столбца в DataFrame я использую:
del df['column_name']
И это работает отлично. Почему я не могу использовать следующее?
del df.column_name
Поскольку вы можете получить доступ к колонке/серии как df.column_name
, я ожидаю, что это будет работать.
Лучший способ сделать это в pandas - использовать drop
:
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
Как вы уже догадались, правильным синтаксисом является
del df['column_name']
Трудно заставить del df.column_name
работать просто в результате синтаксических ограничений в Python. del df[name]
переводится в df.__delitem__(name)
под прикрытием Python.
Использование:
columns = ['Col1', 'Col2', ...]
df.drop(columns, inplace=True, axis=1)
Это позволит удалить один или несколько столбцов на месте. Обратите внимание, что параметр inplace=true`, то был добавлен в версии v0 панды.13 и выиграл'т работать на старых версиях. Вы'd должны присвоить результат обратно в этом случае:
df = df.drop(columns, axis=1)
Удалить первый, второй и четвертый столбцы:
df.drop(df.columns[[0,1,3]], axis=1, inplace=True)
Удалить первый столбец:
df.drop(df.columns[[0]], axis=1, inplace=True)
Есть необязательный параметр на месте
, так что оригинал
данные могут быть изменены без создания копии.
Выбор столбца, кроме того, deletion
Столбец-имя столбца удалить``:
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'])
печать ДФ`:
one two three
A 1 2 3
B 4 5 6
C 7 8 9
ДФ.падение(фр.столбцы[[0]], оси=1, параметр inplace=истина)
печать ДФ`:
two three
A 2 3
B 5 6
C 8 9
три = ДФ.поп('Три') печать ДФ
:
two
A 2
B 5
C 8
Фактический поставленный вопрос, пропустили большинство ответов здесь:
- дель-ДФ.имя_столбца
?Сначала мы должны понять проблему, которая требует от нас, чтобы погрузиться в питон магические методы.
Как Уэс в своем ответе - дель-ДФ['колонки']
карты к Python магический метод ДФ.__delitem__('колонки')
что реализуемых в панд, чтобы удалить столбец
Однако, как отмечено в приведенной выше ссылке о питон магические методы:
В самом деле, дель практически не используется из-за тяжелых жизненных обстоятельствах, при которых он назван; используйте его с осторожностью!
Можно утверждать, что Дель ДФ['аргумент']не следует применять или поощрять, и тем самым
- дель-ДФ.аргумент не должен даже рассматриваться.
Однако, в теории, - дель-ДФ.аргумент column_name может быть выполнен для работы в панды с помощью [*магический метод__delattr__
*]3. Однако это вносит определенные проблемы, проблемы, с которыми - дель-ДФ['аргумент']
реализация уже есть, но в меньшей степени.
Пример Проблемы ## Что, если я определить столбец в таблицу данных под названием "dtypes" или "колонны" и.
Затем предположим, я хочу удалить эти столбцы.
- дель-ДФ.dtypes есть метод
delattr` путают, если его следует удалить в "dtypes на" атрибут или в "dtypes" в столбец.
.іх
, .Лок "или".Мот
методы.Вы не можете сделать - дель-ДФ.аргумент column_name
потому что панды имеет довольно дико выросли архитектуры, который должен быть пересмотрен для того, для этого вида когнитивный диссонанс не произойдет для своих пользователей.
Подсказка###: Дон'т использовать ДФ.аргумент column_name может быть довольно, но его причины когнитивный диссонанс
Существует несколько способов удаления столбца.
там должен быть один-и, желательно, только один-очевидный способ сделать это.
Колонны иногда атрибутов, а иногда нет.
В особых случаях разве'т достаточно, чтобы нарушить правила.
Значит-дель-ДФ.dtypes удалить атрибут dtypes или столбец dtypes?
В условиях неопределенности, отказаться от соблазна угадать.
Приятным дополнением является возможность удалить столбцы, только если они существуют. Таким образом, вы можете охватить больше вариантов использования, и это только капля в существующие столбцы с ярлыками переданный ему:
Просто добавьте ошибки='игнор', например.:
df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
Хорошая практика заключается в том, чтобы всегда использовать обозначение []
. Одна из причин заключается в том, что атрибутивная нотация (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
В панды 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)
Панды версия 0.21 изменился в капля
метод немного как индекс
и столбцы
параметры соответствуют сигнатуре методов переименовать
и переиндексация
.
df.drop(columns=['column_a', 'column_c'])
Лично я предпочитаю использовать параметр " оси " для обозначения столбцов или индексов, потому что это основной параметр сайта использованы практически все методы панды. Но, теперь у вас есть некоторые дополнительные варианты, в версии 0.21.
Немало усилий, чтобы найти несколько более эффективное решение. Трудно оправдать дополнительную сложность в ущерб простоте ДФ.падение(dlst, 1, ошибки='игнор')
df.reindex_axis(np.setdiff1d(df.columns.values, dlst), 1)
Преамбула Удаление столбца семантически же, как и при выборе других столбцов. Я'Лл показывают несколько дополнительных методов.
Я'll тоже ориентироваться на общее решение удаление нескольких столбцов сразу и позволяет для попыток удалить столбцы нет.
Используя эти решения носят общий характер и будет работать для простого случая, а также.
Установки
Рассмотрим ПД.Таблицы данных и списка ДФ
удалить dlst
df = pd.DataFrame(dict(zip('ABCDEFGHIJ', range(1, 11))), range(3))
dlst = list('HIJKLM')
df
A B C D E F G H I J
0 1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9 10
2 1 2 3 4 5 6 7 8 9 10
dlst
['H', 'I', 'J', 'K', 'L', 'M']
Результат должен выглядеть так:
df.drop(dlst, 1, errors='ignore')
A B C D E F G
0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
Так как я'м приравняв удаление столбца для выбора другой колонны, я'МР разбить его на два вида:
Мы начнем с изготовления список/массив меток, которые представляют собой столбцы мы хотим сохранить и без колонок мы хотим удалить.
ДФ.столбцы.разница(dlst)
Индекс(['Это', 'б', 'С', 'д', 'е', 'е', 'Т'], dtype='объект')
НП.setdiff1d(ДФ.столбцы.значения, dlst)
массив(['Это', 'б', 'С', 'д', 'е', 'е', 'Т'], dtype=объект)
ДФ.столбцы.падение(dlst, ошибки='игнор')
Индекс(['Это', 'б', 'С', 'д', 'е', 'е', 'Т'], dtype='объект')
['Е', 'Д', 'Б', 'Е', 'Т', 'ЭТО', 'С']
[х для Х в ДФ.столбцы.значения.список (), если X не в dlst]
['ЭТО', 'Б', 'С', 'Д', 'Е', 'Е', 'Т']
Столбцы с ярлыками Ради сравнения процесс отбора, предположим:
cols = [x for x in df.columns.values.tolist() if x not in dlst]
Тогда можно будет оценить
ДФ.Лок [: высветил]
ДФ[седла]
ДФ.переиндексация(столбцы=седла)
ДФ.reindex_axis(седла, 1)
Которые все оценивают по:
A B C D E F G
0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
Можно построить массив/список булевских переменных для нарезки
~ДФ.столбцы.Исин(dlst)
~НП.in1d(ДФ.столбцы.значения, dlst)
[х не в dlst для X в ДФ.столбцы.значения.список()]
(ДТ.столбцы.значения [: никто] != dlst).все(1)
Столбцов булевой Для сравнения
bools = [x not in dlst for x in df.columns.values.tolist()]
ДФ.Лок[: рисовые шарики]
Которые все оценивают по:
A B C D E F G
0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
Прочная Времени
Функции
setdiff1d = lambda df, dlst: np.setdiff1d(df.columns.values, dlst)
difference = lambda df, dlst: df.columns.difference(dlst)
columndrop = lambda df, dlst: df.columns.drop(dlst, errors='ignore')
setdifflst = lambda df, dlst: list(set(df.columns.values.tolist()).difference(dlst))
comprehension = lambda df, dlst: [x for x in df.columns.values.tolist() if x not in dlst]
loc = lambda df, cols: df.loc[:, cols]
slc = lambda df, cols: df[cols]
ridx = lambda df, cols: df.reindex(columns=cols)
ridxa = lambda df, cols: df.reindex_axis(cols, 1)
isin = lambda df, dlst: ~df.columns.isin(dlst)
in1d = lambda df, dlst: ~np.in1d(df.columns.values, dlst)
comp = lambda df, dlst: [x not in dlst for x in df.columns.values.tolist()]
brod = lambda df, dlst: (df.columns.values[:, None] != dlst).all(1)
Тестирование
res1 = pd.DataFrame(
index=pd.MultiIndex.from_product([
'loc slc ridx ridxa'.split(),
'setdiff1d difference columndrop setdifflst comprehension'.split(),
], names=['Select', 'Label']),
columns=[10, 30, 100, 300, 1000],
dtype=float
)
res2 = pd.DataFrame(
index=pd.MultiIndex.from_product([
'loc'.split(),
'isin in1d comp brod'.split(),
], names=['Select', 'Label']),
columns=[10, 30, 100, 300, 1000],
dtype=float
)
res = res1.append(res2).sort_index()
dres = pd.Series(index=res.columns, name='drop')
for j in res.columns:
dlst = list(range(j))
cols = list(range(j // 2, j + j // 2))
d = pd.DataFrame(1, range(10), cols)
dres.at[j] = timeit('d.drop(dlst, 1, errors="ignore")', 'from __main__ import d, dlst', number=100)
for s, l in res.index:
stmt = '{}(d, {}(d, dlst))'.format(s, l)
setp = 'from __main__ import d, dlst, {}, {}'.format(s, l)
res.at[(s, l), j] = timeit(stmt, setp, number=100)
rs = res / dres
rs
10 30 100 300 1000
Select Label
loc brod 0.747373 0.861979 0.891144 1.284235 3.872157
columndrop 1.193983 1.292843 1.396841 1.484429 1.335733
comp 0.802036 0.732326 1.149397 3.473283 25.565922
comprehension 1.463503 1.568395 1.866441 4.421639 26.552276
difference 1.413010 1.460863 1.587594 1.568571 1.569735
in1d 0.818502 0.844374 0.994093 1.042360 1.076255
isin 1.008874 0.879706 1.021712 1.001119 0.964327
setdiff1d 1.352828 1.274061 1.483380 1.459986 1.466575
setdifflst 1.233332 1.444521 1.714199 1.797241 1.876425
ridx columndrop 0.903013 0.832814 0.949234 0.976366 0.982888
comprehension 0.777445 0.827151 1.108028 3.473164 25.528879
difference 1.086859 1.081396 1.293132 1.173044 1.237613
setdiff1d 0.946009 0.873169 0.900185 0.908194 1.036124
setdifflst 0.732964 0.823218 0.819748 0.990315 1.050910
ridxa columndrop 0.835254 0.774701 0.907105 0.908006 0.932754
comprehension 0.697749 0.762556 1.215225 3.510226 25.041832
difference 1.055099 1.010208 1.122005 1.119575 1.383065
setdiff1d 0.760716 0.725386 0.849949 0.879425 0.946460
setdifflst 0.710008 0.668108 0.778060 0.871766 0.939537
slc columndrop 1.268191 1.521264 2.646687 1.919423 1.981091
comprehension 0.856893 0.870365 1.290730 3.564219 26.208937
difference 1.470095 1.747211 2.886581 2.254690 2.050536
setdiff1d 1.098427 1.133476 1.466029 2.045965 3.123452
setdifflst 0.833700 0.846652 1.013061 1.110352 1.287831
fig, axes = plt.subplots(2, 2, figsize=(8, 6), sharey=True)
for i, (n, g) in enumerate([(n, g.xs(n)) for n, g in rs.groupby('Select')]):
ax = axes[i // 2, i % 2]
g.plot.bar(ax=ax, title=n)
ax.legend_.remove()
fig.tight_layout()
Это относительно времени выполнения ДФ.падение(dlst, 1, ошибки='игнор')
. Кажется, после всех наших усилий, мы лишь незначительно улучшить производительность.
Если факт, лучшие решения использовать переиндексация " или " reindex_axis
в списке взлома - (комплект(ДФ.столбцы.значения.toList ()) для.разница(dlst)). Второе место и еще очень незначительно лучше, чем
капляэто
НП.setdiff1d`.
rs.idxmin().pipe(
lambda x: pd.DataFrame(
dict(idx=x.values, val=rs.lookup(x.values, x.index)),
x.index
)
)
idx val
10 (ridx, setdifflst) 0.653431
30 (ridxa, setdifflst) 0.746143
100 (ridxa, setdifflst) 0.816207
300 (ridx, setdifflst) 0.780157
1000 (ridxa, setdifflst) 0.861622
Синтаксис точка работает в JavaScript, но не в Python.
- дель-ДФ['аргумент']
- дель-ДФ['аргумент']
или - дель-ДФ.имя_столбца
Еще один способ удаления столбца в панды фрейма данных
если вы'повторно не искать в месте удаления, то вы можете создать новую таблицу данных, указывая столбцы, используя таблицу данных(...)` функция, как
my_dict = { 'name' : ['a','b','c','d'], 'age' : [10,20,25,22], 'designation' : ['CEO', 'VP', 'MD', 'CEO']}
df = pd.DataFrame(my_dict)
Создать новую таблицу данных, как
newdf = pd.DataFrame(df, columns=['name', 'age'])
Вы получите результат, как вам с del / падение