Python DataFrame Pandas Drop Column с использованием Int

155

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

user1802143
источник
Я полагаю, что это не будет работать по причинам, указанным здесь: stackoverflow.com/questions/13411544/…
Джон

Ответы:

168

Вы можете удалить столбец в 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 непрерывных столбцов в середине фрейма данных
Сай Киран
113

Удалите несколько столбцов, как это:

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
Для чего нужен аргумент?
Сидпат
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

Как видите, оба столбца X были удалены. Альтернативное решение:

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-й столбец (первый «х»).

Saeed
источник
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)
mkln
источник
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
гром
источник