python dataframe pandas使用int删除列
Posted
技术标签:
【中文标题】python dataframe pandas使用int删除列【英文标题】:python dataframe pandas drop column using int 【发布时间】:2013-12-16 07:58:45 【问题描述】:我知道要删除列,您使用 df.drop('column name', axis=1)。有没有办法使用数字索引而不是列名来删除列?
【问题讨论】:
我认为这不起作用,原因如下:***.com/questions/13411544/… 【参考方案1】:您可以像这样删除i
索引上的列:
df.drop(df.columns[i], axis=1)
如果您在列中有重复的名称,这可能会很奇怪,因此您可以用新名称重命名要删除的列。或者您可以像这样重新分配 DataFrame:
df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]
【讨论】:
我认为你错过了重点——他们想按索引而不是按标签删除。将索引转换为标签只是按标签删除:( 如何索引 cols,如果我必须删除 100 个在数据框中间连续的列 第二种使用 iloc 的技术在列名重复的情况下效果很好,并且非常高效。谢谢。【参考方案2】:像这样删除多个列:
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)
【讨论】:
inplace 参数是干什么用的? 如何索引 cols,如果我必须删除 100 个在数据框中间连续的列。 你可以做类似col_indices = [df.columns.tolist().index(c) for c in list_of_colnames]
【参考方案3】:
如果有多个具有相同名称的列,则此处给出的解决方案将删除所有列,这可能不是人们正在寻找的。如果尝试删除除一个实例之外的重复列,则可能会出现这种情况。下面的例子说明了这种情况:
# 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”)。
【讨论】:
你是我的英雄。试图想一个聪明的方法来做这件事太久了。 这个 iloc 解决方案正是我想要的。删除前 x 列变为df = df.iloc[:, x:]
如果您想删除 x 到 y 列,您可以执行以下操作:all_cols = set(range(0,len(df.columns))) keep_cols = all_cols - set(range(x,y+1)) df = df.iloc[:, list(keep_cols)]
这个答案值得更多的支持,因为它正确处理了重复的列名。
@AlexandreHuat 一个不到1500分的CS领主! ;) 无论如何,谢谢你
哈哈,我只是想照亮某人的一天【参考方案4】:
您需要根据它们在数据框中的位置来识别列。例如,如果你想删除 (del) 列号 2,3 和 5,它将是,
df.drop(df.columns[[2,3,5]], axis = 1)
【讨论】:
【参考方案5】:如果您有两列同名。一种简单的方法是手动重命名列,如下所示:-
df.columns = ['column1', 'column2', 'column3']
然后您可以按照您的要求通过列索引删除,如下所示:-
df.drop(df.columns[1], axis=1, inplace=True)
df.column[1]
将删除索引 1。
记住轴 1 = 列,轴 0 = 行。
【讨论】:
【参考方案6】:如果你真的想用整数来做(但为什么?),那么你可以建立一个字典。
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)
【讨论】:
【参考方案7】:您可以简单地将columns
参数提供给df.drop
命令,这样您就不必在这种情况下指定axis
,就像这样
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
【讨论】:
【参考方案8】:您可以使用以下行删除前两列(或您不需要的任何列):
df.drop([df.columns[0], df.columns[1]], axis=1)
Reference
【讨论】:
【参考方案9】:获取所需列的好方法(重复名称无关紧要)。
例如,您将要删除的列索引包含在类似列表的变量中
unnecessary_cols = [1, 4, 5, 6]
然后
import numpy as np
df.iloc[:, np.setdiff1d(np.arange(len(df.columns)), unnecessary_cols)]
【讨论】:
【参考方案10】:由于可以有多个同名的列,我们应该首先重命名这些列。 这是解决方案的代码。
df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
【讨论】:
以上是关于python dataframe pandas使用int删除列的主要内容,如果未能解决你的问题,请参考以下文章
Python pandas.DataFrame.aggregate函数方法的使用
Python pandas.DataFrame.applymap函数方法的使用
Python pandas.DataFrame.cumprod函数方法的使用
Python pandas.DataFrame.loc函数方法的使用