Я загружаю некоторые данные машинного обучения из файла CSV. Первые 2 столбца являются наблюдениями, а остальные столбцы - объектами.
В настоящее время я делаю следующее:
data = pandas.read_csv('mydata.csv')
который дает что-то вроде:
data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
Я хотел бы, чтобы нарезать это dataframe в двух dataframes: один , содержащие столбцы a
и b
и один , содержащие столбцы c
, d
и e
.
Не возможно написать что-то вроде
observations = data[:'c']
features = data['c':]
Я не уверен, что лучший метод. Нужен ли мне pd.Panel
?
Между прочим, я считаю, что индексирование по фрейму данных довольно противоречиво: data['a']
разрешено, но data[0]
нет. С другой стороны, data['a':]
не разрешено, но data[0:]
есть. Есть ли практическая причина для этого? Это действительно сбивает с толку, если столбцы индексируются Int, учитывая, чтоdata[0] != data[0:1]
df[5:10]
были добавлены некоторые удобства, например, для выбора строк ( pandas.pydata.org/pandas-docs/stable/… )Ответы:
Ответ 2017 - панды 0,20: .ix устарела. Используйте .loc
Смотрите амортизацию в документах
.loc
использует индексирование на основе меток для выбора строк и столбцов. Метки являются значениями индекса или столбцов. Нарезка.loc
включает в себя последний элемент..loc
принимает те же обозначения срезов, что и списки Python для строк и столбцов. Обозначение срезаstart:stop:step
Вы можете нарезать по строкам и столбцам. Например, если у вас есть 5 строк с наклейками
v
,w
,x
,y
,z
источник
df['newcol'] = df.apply(lambda row: myfunc(row), axis=1)
тогда вы можете вmyfunc(row){
... использоватьrow['foo':'ant']
. например (согласно этому ответу StackOverflow ), внутриmyfunc
вы можете оценить, если какой-либо из них не числовой:row['foo':'ant'].apply(lambda x: isinstance(x, str)).any()
.iloc
следует использовать сейчас, а не.loc
. Исправьте это, и я буду голосовать.Примечание:
.ix
устарело с Pandas v0.20. Вы должны вместо этого использовать.loc
или.iloc
, в зависимости от обстоятельств.Индекс DataFrame.ix - это то, к чему вы хотите получить доступ. Это немного сбивает с толку (я согласен, что индексирование Pandas иногда вызывает недоумение!), Но следующее, кажется, делает то, что вы хотите:
где .ix [срез строки, срез столбца] - это то, что интерпретируется. Подробнее об индексации панд здесь: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced
источник
>>>data.ix[:, 'a':'c'] a b c 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159
df.ix[:,[0,3,4]]
df.ix[:,'b':'e']
?loc
вместоix
: stackoverflow.com/a/31593712/4323Давайте использовать в качестве примера титановый набор данных из пакета морского происхождения
или
источник
.ix
устарела.Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative.
когда вы используетеdf.loc[:, some_list_of_columns]
Кроме того, учитывая DataFrame
как в вашем примере, если вы хотите извлечь только столбцы a и d (например, 1-й и 4-й столбцы), iloc mothod из фрейма данных pandas - это то, что вам нужно, и его можно использовать очень эффективно. Все, что вам нужно знать, это индекс столбцов, которые вы хотите извлечь. Например:
дам тебе
источник
Вы можете нарезать вдоль столбцов a
DataFrame
, ссылаясь на имена каждого столбца в списке, например так:источник
get_loc
функцию ondata.columns
для определения индекса столбца 'b' или чего-то еще.И если вы пришли сюда в поисках нарезать два диапазона столбцов и объединить их вместе (как я), вы можете сделать что-то вроде
Это создаст новый фрейм данных с первыми 900 столбцами и (всеми) столбцами> 3593 (при условии, что у вас есть около 4000 столбцов в вашем наборе данных).
источник
Вот как можно использовать различные методы для выборочной нарезки столбцов, включая выборочную на основе меток, на основе индексов и выборочной нарезки столбцов.
источник
Его эквивалент
источник
если фрейм данных выглядит так:
и ВЫХОД может быть как
если вы используете логический оператор np.logical_not
больше о
https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html
другие логические операторы
logic_and (x1, x2, / [, out, where, ...]) Вычисляет значение истинности x1 И x2 поэлементно.
logic_or (x1, x2, / [, out, where, casting, ...]) Вычисляет значение истинности x1 ИЛИ x2 поэлементно.
источник
Другой способ получить подмножество столбцов из вашего DataFrame, предполагая, что вы хотите, чтобы все строки были следующими:
data[['a','b']]
иdata[['c','d','e']]
Если вы хотите использовать числовые индексы столбцов, вы можете сделать:
data[data.columns[:2]]
иdata[data.columns[2:]]
источник