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


当前回答

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

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

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

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

其他回答

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

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

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

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)

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

df.drop([df.columns[0], df.columns[1]], 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')。

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

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

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

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