要删除DataFrame中的列,我可以成功使用:

del df['column_name']

但为什么我不能使用以下选项?

del df.column_name

由于可以通过df.column_name访问该系列,所以我希望这能奏效。


当前回答

一个很好的补充是,只有列存在时才可以删除它们。这样,您可以覆盖更多的用例,并且它只会从传递给它的标签中删除现有列:

例如,只需添加errors='ignore':

df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')

这是熊猫0.16.1以后的新版本。文档在这里。

其他回答

Use:

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

或者你可以和

del df['colname']

基于列编号删除多个列的步骤

df.drop(df.iloc[:,1:3], axis = 1, inplace = True)

基于列名删除多个列的步骤

df.drop(['col1','col2',..'coln'], axis = 1, inplace = True)

总是使用[]符号是一个很好的做法。一个原因是属性表示法(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

点语法在JavaScript中有效,但在Python中无效。

Python:del df['column_name]JavaScript:del df['column_name]或del df.column_name

这里的大多数答案都忽略了实际提出的问题:

为什么不能使用del df.column_name?

首先,我们需要了解这个问题,这需要我们深入研究Python的神奇方法。

正如韦斯在回答中指出的那样,deldf['column']映射到Python的神奇方法df__delitem__('column'),它在Pandas中实现以删除列。

然而,正如上面关于Python魔术方法的链接中所指出的:

事实上,__del__几乎永远不应该被使用,因为它被称为;小心使用!

您可以认为不应该使用或鼓励del df['column_name],因此甚至不应该考虑del df.column_name。

然而,理论上,deldf.column_name可以使用魔术方法__delattr_在Pandas中实现。然而,这确实会带来某些问题,deldf['column_name]实现已经存在的问题,但程度较低。

示例问题

如果我在数据帧中定义了一个名为“dtypes”或“columns”的列,该怎么办?

然后假设我想删除这些列。

deldf.dtypes会使__delattr_方法混淆,好像它应该删除“dtypes”属性或“dtype”列一样。

这个问题背后的建筑问题

数据帧是列的集合吗?数据帧是行的集合吗?列是数据帧的属性吗?

熊猫回答:

是的,在所有方面不,但如果您想这样做,可以使用.ix、.loc或.iloc方法。也许,你想读取数据吗?那么是的,除非该属性的名称已经被属于数据帧的另一个属性所采用。是否要修改数据?那就没有了。

太长,读不下去了

你不能做deldf.column_name,因为Pandas有一个相当广泛的架构,需要重新考虑,以避免用户出现这种认知失调。

专业提示:

不要使用df.column_name。它可能很漂亮,但会导致认知失调。

Python之禅引用如下:

删除列有多种方法。

应该有一种——最好只有一种——明显的方法来实现。

列有时是属性,但有时不是。

特殊情况不足以打破规则。

del df.dtypes是否删除dtypes属性或dtypes列?

面对模棱两可的问题,拒绝猜测。

从版本0.16.1开始,您可以

df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore')