python dataframe pandas drop column, використовуючи int


154

Я розумію, що для скидання стовпця ви використовуєте df.drop ('ім'я стовпця', ось = 1). Чи є спосіб скинути стовпчик, використовуючи числовий індекс замість назви стовпця?


Я думаю, це не вийде з причин, показаних тут: stackoverflow.com/questions/13411544/…
Джон

Відповіді:


167

Ви можете видалити стовпчик з iіндексу так:

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

Це може спрацювати дивно, якщо у вас є дублікати імен у стовпцях, тому для цього ви можете перейменувати стовпець, який ви хочете видалити, на новий ім'я. Або ви можете перепризначити DataFrame так:

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

4
Я думаю, ви пропустили суть - вони хочуть падати за індексом, а не за міткою. Перетворення індексу в мітку просто опускається за міткою :(
Даррен

Як індексувати числа, якщо мені доведеться скинути 100 стовпців, які є безперервними посередині кадру даних
Сай Кіран

112

Видаліть кілька таких стовпців:

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)

3
Для чого аргумент замість?
sidpat

12
якщо ви не користуєтеся inplace=Trueцим, вам доведеться це зробити, df = df.drop()якщо ви хочете побачити зміну в dfсобі.
мюн

Як індексувати лічильники, якщо мені доведеться скинути 100 стовпців, які є безперервними посередині кадру даних.
Сай Кіран

36

Якщо є кілька стовпців з однаковими іменами, рішення, наведені тут, видалять усі стовпці, що може бути не тим, що потрібно шукати. Це може бути, якщо ви намагаєтесь видалити повторювані стовпці, крім одного екземпляра. Приклад нижче пояснює цю ситуацію:

# 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').


1
Ти мій герой. Намагався думати про розумний спосіб зробити це занадто довго.
ATK7474

5

Потрібно визначити стовпці, виходячи з їхнього положення у фреймі даних. Наприклад, якщо ви хочете випустити (del) стовпці номер 2,3 і 5, це буде,

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

4

Якщо у вас є два стовпчики з однаковою назвою. Один простий спосіб - перейменувати стовпці вручну так: -

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

Тоді ви можете перейти через індекс стовпців, як ви просили, наприклад:

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

df.column[1] знизиться індекс 1.

Запам’ятайте вісь 1 = стовпці та вісь 0 = рядки.


3

якщо ви дійсно хочете зробити це з цілими числами (але чому?), тоді ви можете створити словник.

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)

1

Ви можете використовувати наступний рядок, щоб скинути перші два стовпці (або будь-який стовпець, який вам не потрібен):

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

Довідково


-1

Оскільки може бути кілька стовпців з однаковою назвою, спочатку слід перейменувати стовпці. Ось код рішення.

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.