2016-09-08 2 views
0

Я использовал как R, так и Python экстенсивно в своей работе, и иногда я получаю синтаксис между ними в замешательстве.Python list или pandas dataframe произвольное индексирование и нарезка

В R, если бы я хотел создать модель из только некоторые особенности моего набора данных, я могу сделать что-то вроде этого:

subset = df[1:1000, c(1,5,14:18,24)] 

Это займет первые 1000 строк (да , R начинается с индекса 1), и он примет 1-й, 5-й, 14-й по 18-й и 24-й столбцы.

Я попытался сделать любую комбинацию slice, range и аналогичные функции и не смог дублировать такую ​​гибкость. В конце концов, я просто перечислил все значения.

Как это можно сделать в Python?

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

ответ

3

В файле index_tricks, numpy определяет экземпляр класса, который преобразует скаляры и ломтики в нумерованный список, используя r_ метод:

In [560]: np.r_[1,5,14:18,24] 
Out[560]: array([ 1, 5, 14, 15, 16, 17, 24]) 

Это экземпляр с методом __getitem__, так он использует синтаксис индексации. Он расширяет 14:18 до np.arange(14,18). Он также может расширять значения с помощью linspace.

Так что я думаю, что вы бы переписать

subset = df[1:1000, c(1,5,14:18,24)] 

в

df.iloc[:1000, np.r_[0,4,13:17,23]] 
+0

Спасибо! Это скрытый инструмент для упрощения вещей, о которых я не знал! :) –

2

Вы можете использовать iloc для целочисленной индексации в панд:

df.iloc[0:10000, [0, 4] + range(13,18) + [23]] 

Как прокомментировал @root, в Python 3, вам необходимо явно преобразовать range() в список по df.iloc[0:10000, [0, 4] + list(range(13,18)) + [23]]

+1

В качестве примечания, в Python 3 'range' является генератор, поэтому он должен быть преобразован в список : 'list (range (13,18))'. – root

+0

Спасибо, я знаю, это правильно, но слишком грязно и kludgy, IMHO ... особенно потому, что я использую python 3, а это значит, что мне нужно ввести «list (range (13,18))». –

1

Попробуйте это, Первый квадратный скобки. Второй набор квадратов квадратных скобок.

df[[0,4]+ range(13,18)+[23]][:1000] 
+0

Да, это правильно, но слишком «грязно», ИМХО. Это нечто настолько распространенное, что я надеялся на чистое, легко читаемое и простое средство. –

Смежные вопросы