我知道去掉一列要用df。Drop ('column name', 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 = ['column1', 'column2', 'column3']
然后你可以根据你的要求通过列索引,像这样:-
df.drop(df.columns[1], axis=1, inplace=True)
df。列[1]将删除索引1。
记住轴1 =列,轴0 =行。
您可以使用下面的行删除前两列(或任何您不需要的列):
df.drop([df.columns[0], df.columns[1]], axis=1)
参考
您可以简单地为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
感谢我很晚才参加派对,但我也有同样的问题,一个DataFrame有一个MultiIndex。Pandas真的不喜欢非唯一的多索引,在某种程度上,上面的大多数解决方案在这种设置下都不起作用(例如,.drop函数只会错误地带有ValueError:不能处理非唯一的多索引!)
我得到的解决方案是使用.iloc代替。根据文档,use可以使用带有掩码的iloc(=你想保留的列的True/False值列表):
使用长度与列匹配的布尔数组。 df。iloc[:,[正确,错误,正确,错误]]
结合df.columns. duplication()来识别重复的列,你可以以一种高效的、panda -native的方式做到这一点:
df = df.iloc[:, ~df.columns.duplicated()]
获得你想要的列的好方法(没有问题重复的名称)。
例如,您希望删除的列索引包含在类似列表的变量中
unnecessary_cols = [1, 4, 5, 6]
then
import numpy as np
df.iloc[:, np.setdiff1d(np.arange(len(df.columns)), unnecessary_cols)]