我知道去掉一列要用df。Drop ('column name', axis=1)。是否有一种方法可以使用数字索引而不是列名来删除列?


如果您真的想处理整数(为什么?),那么您可以构建一个字典。

col_dict = {x: col for x, col in enumerate(df.columns)}

那么df = df。Drop (col_dict[0], 1)将按预期工作

编辑:你可以把它放在一个为你做这件事的函数中,尽管这样它会在你每次调用它的时候创建字典

def drop_col_n(df, col_n_to_drop):
    col_dict = {x: col for x, col in enumerate(df.columns)}
    return df.drop(col_dict[col_n_to_drop], 1)

df = drop_col_n(df, 2)

你可以像这样删除i索引上的列:

df.drop(df.columns[i], axis=1)

这可能会很奇怪,如果列中有重复的名字,你可以重命名你想要删除的列。或者你可以像这样重新分配数据帧:

df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]

像这样删除多个列:

cols = [1,2,4,5,12]
df.drop(df.columns[cols],axis=1,inplace=True)

inplace=True用于在数据帧本身中进行更改,而不需要在数据帧的副本上进行列删除。如需保留原稿,请使用:

df_after_dropping = df.drop(df.columns[cols],axis=1)

如果有多个具有相同名称的列,那么到目前为止给出的解决方案将删除所有列,这可能不是我们要寻找的。如果试图删除除一个实例之外的重复列,则可能会出现这种情况。下面的例子说明了这种情况:

# make a df with duplicate columns 'x'
df = pd.DataFrame({'x': range(5) , 'x':range(5), 'y':range(6, 11)}, columns = ['x', 'x', 'y']) 


df
Out[495]: 
   x  x   y
0  0  0   6
1  1  1   7
2  2  2   8
3  3  3   9
4  4  4  10

# attempting to drop the first column according to the solution offered so far     
df.drop(df.columns[0], axis = 1) 
   y
0  6
1  7
2  8
3  9
4  10

可以看到,两个x列都被删除了。 可选择的解决方案:

column_numbers = [x for x in range(df.shape[1])]  # list of columns' integer indices

column_numbers .remove(0) #removing column integer index 0
df.iloc[:, column_numbers] #return all columns except the 0th column

   x  y
0  0  6
1  1  7
2  2  8
3  3  9
4  4  10

如您所见,这实际上只删除了第0列(第一个'x')。


由于可以有多个具有相同名称的列,我们应该首先重命名列。 下面是解决方案的代码。

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns

您可以使用下面的行删除前两列(或任何您不需要的列):

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

参考


您需要根据列在数据框架中的位置来标识它们。例如,如果你想删除(del)列2、3和5,它将是,

df.drop(df.columns[[2,3,5]], axis = 1)

如果有两个名称相同的列。一种简单的方法是手动重命名列,就像这样

df.columns = ['column1', 'column2', 'column3']

然后你可以根据你的要求通过列索引,像这样:-

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

df。列[1]将删除索引1。

记住轴1 =列,轴0 =行。


您可以简单地为df提供columns参数。Drop命令,所以在这种情况下你不需要指定轴,像这样

columns_list = [1, 2, 4] # index numbers of columns you want to delete
df = df.drop(columns=df.columns[columns_list])

参考参见这里的columns参数:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html?highlight=drop#pandas.DataFrame.drop


获得你想要的列的好方法(没有问题重复的名称)。

例如,您希望删除的列索引包含在类似列表的变量中

unnecessary_cols = [1, 4, 5, 6]

then

import numpy as np
df.iloc[:, np.setdiff1d(np.arange(len(df.columns)), unnecessary_cols)]

感谢我很晚才参加派对,但我也有同样的问题,一个DataFrame有一个MultiIndex。Pandas真的不喜欢非唯一的多索引,在某种程度上,上面的大多数解决方案在这种设置下都不起作用(例如,.drop函数只会错误地带有ValueError:不能处理非唯一的多索引!)

我得到的解决方案是使用.iloc代替。根据文档,use可以使用带有掩码的iloc(=你想保留的列的True/False值列表):

使用长度与列匹配的布尔数组。 df。iloc[:,[正确,错误,正确,错误]]

结合df.columns. duplication()来识别重复的列,你可以以一种高效的、panda -native的方式做到这一点:

df = df.iloc[:, ~df.columns.duplicated()]