В пандах, как удалить столбцы в числовой последовательности? [Дубликат]

Одна возможность:

myArray = myArray.filter(function( obj ) {
    return obj.field !== 'money';
});

Обратите внимание, что filter создает новый массив. Любые другие переменные, относящиеся к исходному массиву, не будут получать отфильтрованные данные, хотя вы обновляете исходную переменную myArray с помощью новой ссылки. Используйте с осторожностью.

566
задан Mel 23 February 2018 в 10:11
поделиться

12 ответов

Имена столбцов (которые являются строками) не могут быть нарезаны так, как вы пытались.

Здесь у вас есть несколько вариантов. Если вы знаете из контекста, какие переменные вы хотите вырезать, вы можете просто вернуть представление только этих столбцов, передав список в синтаксис __getitem__ ([]].

df1 = df[['a','b']]

В качестве альтернативы, если важно индексировать их численно, а не их именем (скажем, ваш код должен автоматически сделать это, не зная имена первых двух столбцов), вы можете сделать это вместо этого:

df1 = df.iloc[:,0:2] # Remember that Python does not slice inclusive of the ending index.

Кроме того, вы должны ознакомиться с идеей представления объекта Pandas против копии этого объекта. Первый из вышеперечисленных методов вернет новую копию в память желаемого субобъекта (нужные фрагменты).

Иногда, однако, в Pandas существуют соглашения об индексировании, которые не делают этого и вместо этого дают вам новую переменную, которая относится только к той же части памяти, что и субобъект или фрагмент исходного объекта , Это произойдет со вторым способом индексирования, поэтому вы можете изменить его с помощью функции copy(), чтобы получить обычную копию. Когда это происходит, изменение того, что вы думаете, нарезанный объект, может иногда изменять исходный объект. Всегда хорошо смотреть на это.

df1 = df.iloc[0,0:2].copy() # To avoid the case where changing df1 also changes df
845
ответ дан Boern 15 August 2018 в 16:11
поделиться
  • 1
    Примечание: df[['a','b']] создает копию – Wes McKinney 8 July 2012 в 18:54
  • 2
    Да, это было скрыто в моем ответе. Бит о копии использовался только для использования ix[], если вы предпочитаете использовать по умолчанию ix[]. – ely 8 July 2012 в 19:09
  • 3
    ix принимает аргументы среза, поэтому вы также можете получить столбцы. Например, df.ix[0:2, 0:2] получает верхний левый 2x2 суб-массив так же, как и для матрицы NumPy (в зависимости от ваших имен столбцов, конечно). Вы даже можете использовать синтаксис среза для строковых имен столбцов, например df.ix[0, 'Col1':'Col5']. Это получает все столбцы, которые должны быть упорядочены между Col1 и Col5 в массиве df.columns. Неверно сказать, что ix индексирует строки. Это просто его самое основное использование. Он также поддерживает гораздо больше индексирования. Итак, ix совершенно общий для этого вопроса. – ely 31 October 2012 в 21:02
  • 4
    Спасибо за образование. Ты прав. Никогда не знал об этой функции ix. – hobs 31 October 2012 в 21:33
  • 5
    @AndrewCassidy Никогда не используйте .ix снова. Если вы хотите срезать целыми числами, используйте .iloc, который исключает последнюю позицию, как и списки Python. – Ted Petrou 1 July 2017 в 13:55

просто используйте: он выберет столбец b и c.

df1=pd.DataFrame()
df1=df[['b','c']]

, тогда u может просто вызвать df1:

df1
8
ответ дан Akash Nayak 15 August 2018 в 16:11
поделиться

Вы можете предоставить список столбцов, которые нужно удалить, и вернуть обратно DataFrame с помощью только столбцов, необходимых с помощью функции drop() в Pandas DataFrame.

Просто говоря

colsToDrop = ['a']
df.drop(colsToDrop, axis=1)

вернет DataFrame только с столбцами b и c.

Метод drop зарегистрирован здесь здесь .

14
ответ дан Alex Riley 15 August 2018 в 16:11
поделиться

Предполагая, что ваши имена столбцов (df.columns) равны ['index','a','b','c'], тогда нужные вам данные находятся в 3-м & amp; 4-я колонны. Если вы не знаете их имена при запуске вашего скрипта, вы можете это сделать

newdf = df[df.columns[2:4]] # Remember, Python is 0-offset! The "3rd" entry is at slot 2.

. Поскольку EMS указывает в свой ответ , df.ix нарезает столбцы немного больше лаконично, но интерфейс среза .columns может быть более естественным, поскольку он использует синтаксис индексирования / разрезания ванильного 1-D-файла python.

WARN: 'index' является плохим именем для столбца DataFrame , Эта же метка также используется для реального атрибута df.index, массива Index. Поэтому ваш столбец возвращается df['index'], а реальный индекс DataFrame возвращается df.index. Index - это особый тип Series, оптимизированный для поиска значений его элементов. Для df.index это поиск строк по их метке. Этот атрибут df.columns также является массивом pd.Index для поиска столбцов по их меткам.

68
ответ дан Community 15 August 2018 в 16:11
поделиться
  • 1
    Как я уже отмечал в моем комментарии выше, .ix является not только для строк. Он предназначен для нарезки общего назначения и может использоваться для многомерного нарезки. Это в основном просто интерфейс для обычного синтаксиса __getitem__ NumPy. Тем не менее, вы можете легко преобразовать проблему разрезания столбцов в проблему нарезания строк, просто применив операцию транспонирования df.T. В вашем примере используется columns[1:3], что немного вводит в заблуждение. Результатом columns является Series; будьте осторожны, чтобы не рассматривать его как массив. Кроме того, вы, вероятно, должны изменить его как columns[2:3], чтобы соответствовать вашим «третьим и амперным»; 4-е & Quot; комментарий. – ely 31 October 2012 в 21:11
  • 2
    Ах, да, ты прав. Пропустил запятую внутри скобок. Прохладный трюк. – hobs 31 October 2012 в 21:20
  • 3
    @ Mr.F: Мой [2:4] верен. Ваш [2:3] неверен. И используя стандартную нотацию для нарезки питона для генерации последовательности / Серии, не вводит в заблуждение IMO. Но мне нравится ваш обход интерфейса DataFrame для доступа к базовому массиву numpy с помощью ix. – hobs 4 February 2016 в 18:26
  • 4
    Вы правы в этом случае, но точка, которую я пыталась сделать, заключается в том, что в общем случае разрезание с метками в Pandas включает конечную точку среза (или, по крайней мере, это было поведение в большинстве предыдущих Pandas версии). Поэтому, если вы извлекаете df.columns и хотите разрезать его на метку , тогда у вас будет другая семантика семпла, чем если бы вы нарезали ее на целую позицию индекса . Я определенно не объяснил это хорошо в своем предыдущем комментарии. – ely 4 February 2016 в 19:05
  • 5
    Обратите внимание на предупреждение об отставке: .ix устарел. Поэтому это имеет смысл: newdf = df [df.columns [2: 4]] – Martien Lubberink 1 July 2017 в 23:57

Различные подходы, обсуждаемые в вышеприведенных ответах, основаны на предположении, что либо пользователь знает индексы столбцов, чтобы их отбрасывать, либо подмножество, или пользователь хочет подмножить фрейм данных с использованием диапазона столбцов (например, между 'C': ' E '). pandas.DataFrame.drop (), безусловно, является возможностью подмножества данных на основе списка столбцов, определенных пользователем (хотя вы должны быть осторожны, чтобы всегда использовать копию данных и параметры inplace не должны быть True !!) [/ ​​g2]

Другой вариант - использовать pandas.columns.difference (), который задает разницу в именах столбцов и возвращает индексный тип массива, содержащий требуемые столбцы. Ниже приведено решение:

df = pd.DataFrame([[2,3,4],[3,4,5]],columns=['a','b','c'],index=[1,2])
columns_for_differencing = ['a']
df1 = df.copy()[df.columns.difference(columns_for_differencing)]
print(df1)

Выход будет: b c 1 3 4 2 4 5

2
ответ дан Harshit 15 August 2018 в 16:11
поделиться
  • 1
    Копия () не требуется. i.e: df1 = df[df.columns.difference(columns_for_differencing)] вернет новый / скопированный фрейм. Вы сможете изменить df1 без изменения df. Спасибо, кстати. Это было именно то, что мне нужно. – Bazyli Debowski 8 August 2018 в 17:20

Если вы хотите получить один элемент по имени строки и столбцу, вы можете сделать это так же, как df['b'][0]. Это так же просто, как вы можете изобразить.

Или вы можете использовать df.ix[0,'b'], смешанное использование индекса и метки.

Примечание: Поскольку v0.20 ix устарел в пользу loc / iloc.

3
ответ дан jpp 15 August 2018 в 16:11
поделиться

Я нашел этот метод очень полезным:

# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]

Более подробную информацию можно найти здесь здесь

12
ответ дан Sylhare 15 August 2018 в 16:11
поделиться

Начиная с версии 0.11.0, столбцы могут быть отрезаны так, как вы пытались использовать индекс .loc :

df.loc[:, 'C':'E']

возвращает столбцы C через E.


Демонстрация на случайно сгенерированном DataFrame:

import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)), 
                  columns=list('ABCDEF'), 
                  index=['R{}'.format(i) for i in range(100)])
df.head()

Out: 
     A   B   C   D   E   F
R0  99  78  61  16  73   8
R1  62  27  30  80   7  76
R2  15  53  80  27  44  77
R3  75  65  47  30  84  86
R4  18   9  41  62   1  82

Чтобы получить столбцы от C до E (обратите внимание, что в отличие от integer slicing, «E» включен в столбцы):

df.loc[:, 'C':'E']

Out: 
      C   D   E
R0   61  16  73
R1   30  80   7
R2   80  27  44
R3   47  30  84
R4   41  62   1
R5    5  58   0
...

То же самое работает для выбора строк на основе меток. Получить строки «R6» в «R10» из этих столбцов:

df.loc['R6':'R10', 'C':'E']

Out: 
      C   D   E
R6   51  27  31
R7   83  19  18
R8   11  67  65
R9   78  27  29
R10   7  16  94

.loc также принимает логический массив, поэтому вы можете выбрать столбцы, соответствующая запись в массиве True. Например, df.columns.isin(list('BCD')) возвращает array([False, True, True, True, False, False], dtype=bool) - Истинно, если имя столбца находится в списке ['B', 'C', 'D']; False, в противном случае.

df.loc[:, df.columns.isin(list('BCD'))]

Out: 
      B   C   D
R0   78  61  16
R1   27  30  80
R2   53  80  27
R3   65  47  30
R4    9  41  62
R5   78   5  58
...
54
ответ дан user2285236 15 August 2018 в 16:11
поделиться
In [39]: df
Out[39]: 
   index  a  b  c
0      1  2  3  4
1      2  3  4  5

In [40]: df1 = df[['b', 'c']]

In [41]: df1
Out[41]: 
   b  c
0  3  4
1  4  5
48
ответ дан Wes McKinney 15 August 2018 в 16:11
поделиться
  • 1
    Что делать, если я хотел переименовать столбец, например, что-то вроде: df[['b as foo', 'c as bar'], чтобы выход переименовал столбец b в качестве foo и столбец c как bar? – kuanb 14 February 2017 в 21:30
  • 2
    df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'}) – Greg 25 August 2017 в 22:48

Я понимаю, что этот вопрос довольно старый, но в последней версии панд есть простой способ сделать именно это. Имена столбцов (которые являются строками) можно нарезать любым способом.

columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)
33
ответ дан zerovector 15 August 2018 в 16:11
поделиться
  • 1
    Это можно сделать только при создании. Вопрос заключается в том, спрашивает, есть ли у вас уже в кадре данных. – Banjocat 28 November 2017 в 08:05
0
ответ дан tozCSS 5 September 2018 в 15:15
поделиться
0
ответ дан Ankita 28 October 2018 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: