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

del df['column_name']

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

del df.column_name

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


当前回答

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

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

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

其他回答

在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一样好。

Pandas 0.21+答案

Pandas 0.21版略微更改了drop方法,以包括索引和列参数,以匹配重命名和重新索引方法的签名。

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

就我个人而言,我更喜欢使用axis参数来表示列或索引,因为它是几乎所有panda方法中使用的主要关键字参数。但是,现在您在0.21版中增加了一些选择。

按索引删除

删除第一列、第二列和第四列:

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

删除第一列:

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

此处有一个可选参数可以在不创建副本的情况下修改数据。

被逮捕的

列选择、添加、删除

删除列列名:

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'])

打印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)打印df:

   two  three
A    2      3
B    5      6
C    8      9

三=df.pop(“三”)打印df:

   two
A    2
B    5
C    8

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

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

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

通过使用自动补全或“IntelliSense”而不是字符串文字来获得优势:

del df[df.column1.name]

# or

df.drop(df.column1.name, axis=1, inplace=True)

它适用于当前的Pandas版本。