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

del df['column_name']

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

del df.column_name

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


当前回答

在Pandas中执行此操作的最佳方法是使用drop:

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

其中1是轴号(0表示行,1表示列。)

或者,drop()方法接受索引/列关键字作为指定轴的替代方法。所以我们现在可以做:

df = df.drop(columns=['column_nameA', 'column_nameB'])

这是在v0.21.0中引入的(2017年10月27日)

要删除列而不必重新分配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

同时使用列的“text”语法:

df.drop(['column_nameA', 'column_nameB'], 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

从Python的一般观点来看,如果可以删除属性column_name,del obj.column_name是有意义的。它需要是一个常规属性,或者是一个定义了删除器的属性。

这不适用于Pandas,也不适用于Pandas数据帧的原因如下:

考虑df.column_name是一个“虚拟属性”,它本身不是一个东西,它不是该列的“座位”,它只是访问该列的一种方式。很像没有删除器的属性。

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

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

使用数据帧和切片的iloc函数删除列,当我们有一个带有不需要的值的典型列名时:

df = df.iloc[:,1:] # Removing an unnamed index column

这里0是默认行,1是第一列,因此:,1:是删除第一列的参数。

要删除特定列之前和之后的列,可以使用truncate方法。例如:

   A   B    C     D      E
0  1  10  100  1000  10000
1  2  20  200  2000  20000

df.truncate(before='B', after='D', axis=1)

输出:

    B    C     D
0  10  100  1000
1  20  200  2000