python dataframe pandy upuść kolumnę za pomocą int

154

Rozumiem, że aby upuścić kolumnę, należy użyć df.drop („nazwa kolumny”, oś = 1). Czy istnieje sposób na usunięcie kolumny przy użyciu indeksu liczbowego zamiast nazwy kolumny?

user1802143
źródło
Wydaje mi się, że to nie zadziała z powodów pokazanych tutaj: stackoverflow.com/questions/13411544/…
John

Odpowiedzi:

167

Możesz usunąć kolumnę z iindeksu w następujący sposób:

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

Może to działać dziwnie, jeśli masz zduplikowane nazwy w kolumnach, więc aby to zrobić, możesz zmienić nazwę kolumny, którą chcesz usunąć, według nowej nazwy. Lub możesz zmienić przypisanie DataFrame w następujący sposób:

df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]
Roman Pekar
źródło
4
Myślę, że przegapiłeś punkt - chcą spadać według indeksu, a nie według etykiety. Konwersja indeksu na etykietę po prostu spada według etykiety :(
Darren
Jak indeksować kolumny, jeśli muszę upuścić 100 kolumn, które są ciągłe w środku ramki danych
Sai Kiran
112

Upuść wiele kolumn w ten sposób:

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

inplace=Truesłuży do wprowadzania zmian w samej ramce danych bez upuszczania kolumny na kopię ramki danych. Jeśli chcesz zachować oryginał w stanie nienaruszonym, użyj:

df_after_dropping = df.drop(df.columns[cols],axis=1)
mion
źródło
3
Po co jest argument inplace?
sidpat
12
jeśli nie używasz inplace=True, będziesz musiał zrobić, df = df.drop()jeśli chcesz zobaczyć zmianę w dfsobie.
mion
Jak indeksować kolumny, jeśli muszę upuścić 100 kolumn, które są ciągłe w środku ramki danych.
Sai Kiran
36

Jeśli istnieje wiele kolumn o identycznych nazwach, rozwiązania podane tutaj do tej pory usuwają wszystkie kolumny, które mogą nie być tym, czego szukasz. Może się tak zdarzyć, jeśli ktoś próbuje usunąć zduplikowane kolumny z wyjątkiem jednej instancji. Poniższy przykład wyjaśnia tę sytuację:

# 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

Jak widać, obie kolumny X zostały usunięte. Alternatywne rozwiązanie:

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

Jak widać, to naprawdę usunęło tylko zerową kolumnę (pierwszy „x”).

Saeed
źródło
1
Jesteś moim bohaterem. Zbyt długo próbowałem wymyślić sprytny sposób, aby to zrobić.
ATK7474
5

Musisz zidentyfikować kolumny na podstawie ich pozycji w ramce danych. Na przykład, jeśli chcesz usunąć (usunąć) kolumnę nr 2, 3 i 5, będzie to:

df.drop(df.columns[[2,3,5]], axis = 1)
Kripalu Sar
źródło
4

Jeśli masz dwie kolumny o tej samej nazwie. Prostym sposobem jest ręczna zmiana nazw kolumn w następujący sposób: -

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

Następnie możesz upuścić przez indeks kolumn zgodnie z żądaniem, na przykład: -

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

df.column[1] spadnie indeks 1.

Pamiętaj, że oś 1 = kolumny, a oś 0 = wiersze.

Krzywka
źródło
3

jeśli naprawdę chcesz to zrobić z liczbami całkowitymi (ale dlaczego?), możesz zbudować słownik.

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

wtedy df = df.drop(col_dict[0], 1)będzie działać zgodnie z życzeniem

edycja: możesz umieścić go w funkcji, która robi to za Ciebie, chociaż w ten sposób tworzy słownik za każdym razem, gdy go wywołasz

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)
mkln
źródło
1

Możesz użyć następującego wiersza, aby upuścić pierwsze dwie kolumny (lub dowolną kolumnę, której nie potrzebujesz):

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

Odniesienie

Mojtaba Peyrovi
źródło
-1

Ponieważ może istnieć wiele kolumn o tej samej nazwie, powinniśmy najpierw zmienić nazwy kolumn. Oto kod rozwiązania.

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
grzmot
źródło