繁体   English   中英

python dataframe pandas使用int删除列

[英]python dataframe pandas drop column using int

我知道要删除列,请使用 df.drop('column name', axis=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 = [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”)。

您需要根据它们在数据框中的位置来识别列。 例如,如果要删除 (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.column[1]将删除索引 1。

记住轴 1 = 列和轴 0 = 行。

您可以简单地将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

如果你真的想用整数来做(但为什么?),那么你可以建立一个字典。

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)

参考

获取所需列的好方法(与重复名称无关)。

例如,您将要删除的列索引包含在类似列表的变量中

unnecessary_cols = [1, 4, 5, 6]

那么

import numpy as np
df.iloc[:, np.setdiff1d(np.arange(len(df.columns)), unnecessary_cols)]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM