从包含pandas的数据框中删除int列

python dataframe pandas drop column using int

我知道要删除列,可以使用df.drop("列名",轴=1)。是否可以使用数字索引而不是列名删除列?


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

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

如果列中有重复的名称,它可能会工作得很奇怪,因此要执行此操作,可以用新名称重命名要删除的列。或者您可以这样重新分配数据帧:

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

像这样删除多个列:

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 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

如您所见,两个XS列都被删除了。替代方案:

1
2
3
4
5
6
7
8
9
10
11
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")。


如果你真的想用整数来做(但是为什么呢?),然后你可以建立一本字典。

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

那么,df = df.drop(col_dict[0], 1)将按需要工作。

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

1
2
3
4
5
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)

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

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

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

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

参考文献


因为可以有多个列具有相同的名称,我们应该首先重命名这些列。这是解决方案的代码。

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