python dataframe pandas soltar coluna usando int


Respostas:


167

Você pode excluir a coluna no iíndice assim:

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

Pode ser estranho, se você tiver nomes duplicados nas colunas, para fazer isso, você pode renomear a coluna que deseja excluir a coluna pelo novo nome. Ou você pode reatribuir o DataFrame assim:

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

4
Eu acho que você perdeu o ponto - eles querem cair por índice, não por rótulo. A conversão de índice em um rótulo está apenas caindo por rótulo :(
Darren

Como indexar colunas, se eu tiver que soltar 100 colunas que são contínuas no meio do quadro de dados
Sai Kiran

111

Solte várias colunas assim:

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

inplace=Trueé usado para fazer as alterações no próprio quadro de dados sem fazer a coluna cair em uma cópia do quadro de dados. Se você precisar manter o original intacto, use:

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

3
Para que serve o argumento local?
sidpat 8/16

12
se você não usar inplace=True, precisará fazê- df = df.drop()lo se quiser ver a mudança em dfsi.
muon

Como indexar colunas, se eu tiver que soltar 100 colunas que são contínuas no meio do quadro de dados.
Sai Kiran

36

Se houver várias colunas com nomes idênticos, as soluções fornecidas até agora removerão todas as colunas, o que pode não ser o que você está procurando. Esse pode ser o caso se alguém estiver tentando remover colunas duplicadas, exceto uma instância. O exemplo abaixo esclarece esta situação:

# 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

Como você pode ver, as duas colunas Xs foram descartadas. Solução alternativa:

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

Como você pode ver, isso realmente removeu apenas a coluna 0 (primeiro 'x').


1
Voce é meu herói. Estava tentando pensar em uma maneira inteligente de fazer isso por muito tempo.
ATK7474

5

Você precisa identificar as colunas com base em suas posições no quadro de dados. Por exemplo, se você deseja soltar (del) os números de colunas 2,3 e 5, será,

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

4

Se você tiver duas colunas com o mesmo nome. Uma maneira simples é renomear manualmente as colunas assim:

df.columns = ['column1', 'column2', 'column3']

Em seguida, você pode soltar pelo índice da coluna conforme solicitado, assim: -

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

df.column[1] vai largar o índice 1.

Lembre-se do eixo 1 = colunas e do eixo 0 = linhas.


3

se você realmente quiser fazer isso com números inteiros (mas por quê?), poderá criar um dicionário.

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

então df = df.drop(col_dict[0], 1)funcionará como desejado

edit: você pode colocá-lo em uma função que faz isso por você, embora desta maneira crie o dicionário toda vez que você o chamar

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)

1

Você pode usar a seguinte linha para eliminar as duas primeiras colunas (ou qualquer coluna que você não precisa):

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

Referência


-1

Como pode haver várias colunas com o mesmo nome, devemos renomear as colunas. Aqui está o código para a solução.

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.