У меня есть данные в разных столбцах, но я не знаю, как извлечь их, чтобы сохранить в другой переменной.
index a b c
1 2 3 4
2 3 4 5
Как выбрать 'a'
, 'b'
и сохранить его , чтобы df1?
Я старался
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Никто, кажется, не работает.
.ix
поскольку это неоднозначно. Используйте.iloc
или,.loc
если вы должны.> csvtable_imp_1 <- csvtable_imp[0:6]
и он выбирает величину дельты в первых столбцах от 0 до 6. Все, что мне нужно было сделать, это прочитать таблицу csv, разделенную библиотекой readr.infile_1 = largefile_stay.ix[:,0:6]
ix
сейчас не рекомендуется. Pandas рекомендует использовать либо:loc
(индексация на основе меток), либоiloc
(позиционная индексация).Ответы:
Имена столбцов (которые являются строками) не могут быть разрезаны так, как вы пытались.
Здесь у вас есть несколько вариантов. Если вы знаете из контекста, какие переменные вы хотите вырезать, вы можете просто вернуть представление только этих столбцов, передав список в
__getitem__
синтаксис ([]).Или же, если имеет значение индексировать их численно, а не по их имени (скажем, ваш код должен делать это автоматически, не зная имен первых двух столбцов), тогда вы можете сделать это вместо этого:
Кроме того, вы должны ознакомиться с идеей представления объекта Pandas вместо его копии. Первый из вышеперечисленных методов вернет новую копию в память нужного подобъекта (желаемых фрагментов).
Однако иногда в Pandas существуют соглашения об индексировании, которые этого не делают и вместо этого дают новую переменную, которая просто ссылается на тот же кусок памяти, что и субобъект или фрагмент исходного объекта. Это произойдет со вторым способом индексации, поэтому вы можете изменить его с помощью
copy()
функции, чтобы получить обычную копию. Когда это происходит, изменение того, что вы считаете разрезанным объектом, иногда может изменить исходный объект. Всегда хорошо быть настороже.Чтобы использовать
iloc
, вам нужно знать позиции столбцов (или индексы). Поскольку позиции столбцов могут изменяться, вместо жестко кодированных индексов вы можете использоватьiloc
вместе сget_loc
функциейcolumns
метода объекта dataframe для получения индексов столбцов.Теперь вы можете использовать этот словарь для доступа к столбцам через имена и использование
iloc
.источник
df[['a','b']]
выдает копиюix[]
если вы предпочитаете использоватьix[]
по любой причине.ix
индексирует строки, а не столбцы. Я думал, что ОП хотел столбцы.ix
принимает аргументы среза, поэтому вы также можете получить столбцы. Например,df.ix[0:2, 0:2]
получает верхний левый подмассив 2x2, как это делается для матрицы NumPy (конечно, в зависимости от имен столбцов). Вы даже можете использовать синтаксис среза для строковых имен столбцов, напримерdf.ix[0, 'Col1':'Col5']
. Это получает все столбцы, которые, как оказалось, упорядочены междуCol1
иCol5
вdf.columns
массиве. Неверно говорить, чтоix
индексирует строки. Это всего лишь его основное использование. Он также поддерживает гораздо больше индексации, чем это. Итак,ix
является совершенно общим для этого вопроса..iloc
исключающую последнюю позицию, как списки Python.Начиная с версии 0.11.0 столбцы можно разрезать так, как вы пытались использовать
.loc
индексатор:эквивалентно
и возвращает столбцы
C
черезE
.Демонстрация случайно сгенерированного DataFrame:
Чтобы получить столбцы от C до E (обратите внимание, что в отличие от целочисленной нарезки 'E' включено в столбцы):
То же самое работает для выбора строк на основе меток. Получите строки 'R6' до 'R10' из этих столбцов:
.loc
также принимает логический массив, чтобы вы могли выбрать столбцы, чья соответствующая запись в массивеTrue
. Например,df.columns.isin(list('BCD'))
возвращаетarray([False, True, True, True, False, False], dtype=bool)
- True, если имя столбца находится в списке['B', 'C', 'D']
; Ложно, иначе.источник
Предполагая, что ваши имена столбцов (
df.columns
)['index','a','b','c']
, то данные, которые вы хотите, находятся в 3-м и 4-м столбцах. Если вы не знаете их имен при запуске скрипта, вы можете сделать этоКак указывает EMS в своем ответе ,
df.ix
столбцы срезаются немного более кратко, но.columns
интерфейс среза может быть более естественным, поскольку он использует ванильный 1-D синтаксис индексации / среза списка Python.ВНИМАНИЕ:
'index'
это плохое имя дляDataFrame
столбца. Эта же метка также используется для реальногоdf.index
атрибута,Index
массива. Таким образом, ваш столбец возвращается,df['index']
а реальный индекс DataFrame -df.index
. AnIndex
- это особый вид,Series
оптимизированный для поиска значений его элементов. Для df.index это поиск строк по их меткам. Этотdf.columns
атрибут также являетсяpd.Index
массивом для поиска столбцов по их меткам.источник
.ix
это не только для строк. Он предназначен для нарезки общего назначения и может использоваться для многомерного среза. По сути, это просто интерфейс к обычному__getitem__
синтаксису NumPy . Тем не менее, вы можете легко преобразовать проблему нарезки столбцов в задачу нарезки строк, просто применив операцию транспонированияdf.T
. Ваш пример используетcolumns[1:3]
, что немного вводит в заблуждение. Результатомcolumns
являетсяSeries
; будьте осторожны, чтобы не относиться к нему как к массиву. Кроме того, вам, вероятно, следует изменить его, чтобы онcolumns[2:3]
соответствовал вашему 3-му и 4-му комментарию.[2:4]
правильно. Вы[2:3]
не правы. И использование стандартной нотации Python для создания последовательности / Series не вводит в заблуждение IMO. Но мне нравится ваш обход интерфейса DataFrame для доступа к базовому массиву numpyix
.df.columns
и хотите разрезать его по метке , то у вас будет другая семантика слайса, чем если бы вы разрезали его по позиции целочисленного индекса . Я определенно не объяснил это хорошо в моем предыдущем комментарии все же.columns
это неизменная серия, и получатель был переопределен для использования меток в качестве индексов. Спасибо, что нашли время, чтобы уточнить.источник
df[['b as foo', 'c as bar']
так, чтобы вывод переименовал столбецb
какfoo
и столбецc
какbar
?df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})
Я понимаю, что этот вопрос довольно старый, но в последней версии панд есть простой способ сделать именно это. Имена столбцов (которые являются строками) могут быть нарезаны любым удобным для вас способом.
источник
Вы можете предоставить список столбцов, которые нужно удалить, и вернуть обратно DataFrame, используя только те столбцы, которые необходимы, используя
drop()
функцию в Pandas DataFrame.Просто говорю
вернул бы DataFrame только со столбцами
b
иc
.drop
Метод документирован здесь .источник
С пандами,
названия столбцов остроумия
выбрать по iloc и конкретным столбцам с порядковым номером:
с именами столбцов loc можно использовать как
источник
Я нашел этот метод очень полезным:
Более подробную информацию можно найти здесь
источник
surveys_df.iloc [:, [2,5]]
тогда.Начиная с 0.21.0, использование
.loc
или[]
со списком с одним или несколькими отсутствующими ярлыками не рекомендуется в пользу.reindex
. Итак, ответ на ваш вопрос:df1 = df.reindex(columns=['b','c'])
В предыдущих версиях использование
.loc[list-of-labels]
работало до тех пор, пока был найден хотя бы один из ключей (в противном случае он вызывал бы aKeyError
). Это поведение устарело и теперь показывает предупреждение. Рекомендуемая альтернатива заключается в использовании.reindex()
.Подробнее читайте в разделе «Индексирование и выбор данных»
источник
Вы можете использовать панд. Я создаю DataFrame:
Фрейм данных:
Чтобы выбрать 1 или более столбцов по имени:
Вы также можете использовать:
И вы получите столбец
Test_2
Вы также можете выбрать столбцы и строки из этих строк, используя
.loc()
. Это называется "нарезка" . Обратите внимание, что я беру из столбцаTest_1
вTest_3
«Срез» - это:
И если вы просто хотите ,
Peter
иAnn
из колонокTest_1
иTest_3
:Ты получаешь:
источник
Если вы хотите получить один элемент по индексу строки и имени столбца, вы можете сделать это так же, как
df['b'][0]
. Это так просто, как вы можете себе представить.Или вы можете использовать
df.ix[0,'b']
смешанное использование индекса и метки.Примечание. Поскольку версия 0.20
ix
устарела в пользуloc
/iloc
.источник
Один другой и простой подход: итерация строк
используя iterows
источник
Различные подходы, рассмотренные в ответах выше, основаны на предположении, что либо пользователь знает индексы столбцов для отбрасывания или поднабора, либо пользователь желает установить подкадр данных с использованием диапазона столбцов (например, между «C»: «E») , pandas.DataFrame.drop () , безусловно , является возможность данных подмножества на основе списка столбцов , определенных пользователем (хотя вы должны быть осторожны , что вы всегда использовать копию dataframe и INPLACE параметры не должны быть установлены в значение True !!)
Другой вариант - использовать pandas.columns.difference () , который устанавливает различие в именах столбцов и возвращает индексный тип массива, содержащего нужные столбцы. Ниже приводится решение:
Выход будет:
b c 1 3 4 2 4 5
источник
df1 = df[df.columns.difference(columns_for_differencing)]
вернет новый / скопированный кадр данных. Вы сможете изменитьdf1
без измененийdf
. Спасибо, кстати. Это было именно то, что мне было нужно.Вы также можете использовать df.pop ()
дайте мне знать, если это поможет вам, пожалуйста, используйте df.pop (c)
источник
Я видел несколько ответов на этот вопрос, но он остался неясным для меня. Как бы вы выбрали эти столбцы интересов? Ответ заключается в том, что если они собраны в списке, вы можете просто ссылаться на столбцы, используя список.
пример
У меня есть следующий массив list / numpy
extracted_features
, указывающий 63 столбца. Исходный набор данных имеет 103 столбца, и я хотел бы извлечь именно те, то я бы использовалИ вы закончите с этим
Это то, что вы бы использовали довольно часто в машинном обучении (точнее, в выборе функций). Я хотел бы обсудить и другие способы, но я думаю, что это уже было рассмотрено другими стековыми потоками. Надеюсь, что это было полезно!
источник
Вы можете использовать
pandas.DataFrame.filter
метод для фильтрации или изменения порядка столбцов следующим образом:источник
источник