Carrego alguns dados de aprendizado de máquina de um arquivo CSV. As duas primeiras colunas são observações e as colunas restantes são recursos.
Atualmente, faço o seguinte:
data = pandas.read_csv('mydata.csv')
o que dá algo como:
data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
Eu gostaria de cortar esta trama de dados em duas dataframes: um contendo as colunas a
e b
e um contendo as colunas c
, d
e e
.
Não é possível escrever algo como
observations = data[:'c']
features = data['c':]
Não sei ao certo qual é o melhor método. Eu preciso de um pd.Panel
?
A propósito, acho a indexação do quadro de dados bastante inconsistente: data['a']
é permitido, mas data[0]
não é. Por outro lado, data['a':]
não é permitido, mas data[0:]
é. Existe uma razão prática para isso? Isso é realmente confuso se as colunas são indexadas por Int, já quedata[0] != data[0:1]
df[5:10]
foram adicionadas para a seleção de linhas ( pandas.pydata.org/pandas-docs/stable/… )Respostas:
Resposta 2017 - pandas 0,20: .ix está obsoleto. Use .loc
Veja a reprovação nos documentos
.loc
usa indexação baseada em rótulo para selecionar linhas e colunas. Os rótulos são os valores do índice ou das colunas. Fatiar com.loc
inclui o último elemento..loc
aceita a mesma notação de fatia que as listas Python fazem para linhas e colunas. Notação de fatia sendostart:stop:step
Você pode cortar por linhas e colunas. Por exemplo, se você tem 5 linhas com rótulos
v
,w
,x
,y
,z
fonte
df['newcol'] = df.apply(lambda row: myfunc(row), axis=1)
então você podemyfunc(row){
... userow['foo':'ant']
. por exemplo (de acordo com esta resposta do StackOverflow ), dentro demyfunc
você pode avaliar se algum deles não é numérico:row['foo':'ant'].apply(lambda x: isinstance(x, str)).any()
.iloc
deve ser usado agora, em vez de.loc
. Corrija isso, e eu vou votar.Nota:
.ix
está obsoleto desde o Pandas v0.20. Você deve usar.loc
ou.iloc
, conforme apropriado.O índice DataFrame.ix é o que você deseja acessar. É um pouco confuso (eu concordo que a indexação do Pandas às vezes é desconcertante!), Mas o seguinte parece fazer o que você deseja:
onde .ix [fatia de linha, fatia de coluna] é o que está sendo interpretado. Mais sobre a indexação do Pandas aqui: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced
fonte
>>>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
em vez deix
: stackoverflow.com/a/31593712/4323Vamos usar o conjunto de dados titânico do pacote seaborn como um exemplo
ou
fonte
.ix
está obsoleto.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]
Além disso, dado um DataFrame
como no seu exemplo, se você deseja extrair apenas as colunas a e d (da 1ª e da 4ª coluna), o iloc mothod do quadro de dados do pandas é o que você precisa e pode ser usado com muita eficiência. Tudo o que você precisa saber é o índice das colunas que deseja extrair. Por exemplo:
Darei à você
fonte
Você pode dividir as colunas de a
DataFrame
consultando os nomes de cada coluna em uma lista, da seguinte maneira:fonte
get_loc
funçãodata.columns
para determinar o índice da coluna 'b' ou qualquer outra coisa.E se você veio aqui procurando fatiar duas faixas de colunas e combiná-las (como eu), pode fazer algo como
Isso criará um novo quadro de dados com as primeiras 900 colunas e (todas) colunas> 3593 (supondo que você tenha cerca de 4000 colunas no seu conjunto de dados).
fonte
Veja como você pode usar métodos diferentes para fatiar seletivamente as colunas, incluindo o rótulo seletivo, o índice e o intervalo seletivo.
fonte
Seu equivalente
fonte
se o quadro de dados for assim:
e OUTPUT pode ser como
se você usar o operador lógico np.logical_not
mais sobre
https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html
outros operadores lógicos
logic_and (x1, x2, / [, out, where, ...]) Calcule o valor de verdade de x1 AND x2 em termos de elementos.
logic_or (x1, x2, / [, out, where, casting, ...]) Calcule o valor de verdade de x1 OR x2 em termos de elementos.
fonte
Outra maneira de obter um subconjunto de colunas da trama de dados, supondo que você quer todas as linhas, seria fazer:
data[['a','b']]
edata[['c','d','e']]
Se você quiser usar índices de coluna numéricos que você pode fazer:
data[data.columns[:2]]
edata[data.columns[2:]]
fonte