python数据帧使用int删除列
我知道要删除一列,您需要使用df.drop('column name',axis=1)。有没有一种方法可以使用数字索引而不是列名来删除列?如果您确实想使用整数来删除列(但为什么?),那么您可以构建一个字典python数据帧使用int删除列,python,pandas,dataframe,Python,Pandas,Dataframe,我知道要删除一列,您需要使用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
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)
若列中有重复的名称,那个么这可能会很奇怪,所以若要执行此操作,可以使用新名称重命名要删除的列。或者,您可以像这样重新分配数据帧:
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)
像这样删除多个列:
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
如您所见,两个Xs列都被删除了。
替代解决方案:
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
可以使用以下行删除前两列(或不需要的任何列):
您需要根据列在数据框中的位置来识别列。例如,如果要删除(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.columns = ['column1', 'column2', 'column3']
df.drop(df.columns[1], axis=1, inplace=True)
df.列[1]
将删除索引1
记住轴1=列,轴0=行。您可以简单地将
列
参数提供给df。drop
命令,这样您就不会在这种情况下指定轴
,如下所示
columns_list = [1, 2, 4] # index numbers of columns you want to delete
df = df.drop(columns=df.columns[columns_list])
参考请参见此处的
列
参数:我认为这将不起作用,原因如下:inplace参数的作用是什么?如果不使用inplace=True
,则必须执行df=df.drop(),如果我不得不删除在数据帧中间连续的100列,我想你错过了要点——他们想通过索引而不是标签来下降。将索引转换为标签只需按标签删除:(如何索引COLS,如果我不得不删除在数据帧中间连续的100列,那么使用ILoc的第二种技术很好地给出重复的列名,而且非常有效率。谢谢。你是我的英雄。正试图想出一种聪明的方法来做这件事。太久了。ILoc解决方案正是我所要寻找的。e第一个x列变为df=df.iloc[:,x::]
如果要从x列删除y列,可以执行如下操作:all\u cols=set(range(0,len(df.columns)))keep\u cols=all\u cols-set(range(x,y+1))df=df.iloc[:,list(keep\cols)]
这个答案值得更多的投票,因为它正确地处理了重复的列名。