NOTA: A conversão do Pandas DataFrame em uma matriz (ou lista) como essa pode ser um indicativo de outros problemas. Eu recomendo fortemente garantindo que a trama de dados é a estrutura de dados apropriada para o seu caso de uso particular, e que Pandas não inclui qualquer forma de realizar as operações que você está interessado.
AMC
Respostas:
353
Para obter uma matriz NumPy, você deve usar o valuesatributo:
In[1]: df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]}, index=['a','b','c']); df
A B
a 14
b 25
c 36In[2]: df.index.values
Out[2]: array(['a','b','c'], dtype=object)
Isso acessa como os dados já estão armazenados, portanto, não há necessidade de conversão.
Nota: Este atributo também está disponível para muitos outros objetos dos pandas.
Nota: .valuesestá obsoleta, .to_numpy()é a substituição sugerida se você deseja uma matriz NumPy. Você pode expandir Isso acessa como os dados já estão armazenados, para que não haja necessidade de conversão ?
AMC
A resposta de cs95 fornece uma grande explicação de .values, .to_numpy()e .array.
AMC
75
Você pode usar df.indexpara acessar o objeto de índice e obter os valores em uma lista usando df.index.tolist(). Da mesma forma, você pode usar o df['col'].tolist()Series.
Ele retorna instanceMethod e não uma matriz de lista
V Shreyas
12
@VShreyas, how aboutdf.index.values.tolist()
LancelotHolmes
3
df.index.tolist()não retorna um método de instância. Retorna uma lista de índices. É um método definido no índice de pandas. Embora chamar valores seja uma possibilidade, delegar o trabalho a numpy não é uma correção - apenas uma alternativa.
ayhan
51
pandas> = 0,24
Descontinue seu uso .valuesem favor desses métodos!
De v0.24.0 em diante, teremos dois métodos marca muito novo, preferidos para a obtenção de matrizes Numpy partir Index, Seriese DataFrameobjetos: eles são to_numpy(), e .array. Em relação ao uso, os documentos mencionam:
Não removemos ou descontinuamos Series.valuesou
DataFrame.values, mas é altamente recomendável usar .arrayou
.to_numpy()não.
Em relação ao que é retornado, os documentos mencionam,
Para Seriese Indexes suportados por matrizes NumPy normais, Series.array
retornará um novo arrays.PandasArray, que é um invólucro fino (sem cópia) em torno de a numpy.ndarray. arrays.PandasArraynão é especialmente útil por si só, mas fornece a mesma interface que qualquer matriz de extensão definida em pandas ou por uma biblioteca de terceiros.
Então, para resumir, .arrayretornará
O ExtensionArraysuporte existente ao Index / Series, ou
Se houver uma matriz NumPy apoiando a série, um novo ExtensionArrayobjeto será criado como um invólucro fino sobre a matriz subjacente.
Justificativa para adicionar DOIS novos métodos
Essas funções foram adicionadas como resultado de discussões em dois problemas do GitHub, GH19954 e GH23623 .
Especificamente, os documentos mencionam a lógica:
[...] com .valuesisso não ficou claro se o valor retornado seria a matriz real, alguma transformação dela ou uma das matrizes personalizadas do pandas (como Categorical). Por exemplo, com PeriodIndex, .values
gera um novo ndarrayobjeto de ponto a cada vez. [...]
Essas duas funções visam melhorar a consistência da API, que é um passo importante na direção certa.
Por fim, .valuesnão será descontinuado na versão atual, mas espero que isso aconteça em algum momento no futuro, por isso, exortaria os usuários a migrarem para a API mais recente o mais rápido possível.
Se você estiver lidando com um quadro de dados com vários índices, poderá estar interessado em extrair apenas a coluna de um nome do multi-índice. Você pode fazer isso como
df.index.get_level_values('name_sub_index')
e, claro, name_sub_indexdeve ser um elemento doFrozenListdf.index.names
Existe uma diferença entre isso e valores. (Atualizei as informações da versão, pois essa função aparece nos documentos 0.13.0.) #
Andy Hayden
@ Hayden: Não é uma diferença que.
Ezequiel Kruglick
@EzekielKruglick por isso é sempre uma cópia? O link para a documentação é muito leve, eu não acho que você seja burro assim (mesmo que eles estejam no MI, eles não estarão nos valores.) Seria ótimo ver um exemplo que demonstra isso!
Andy Hayden
@ AndyHayden: Acho que estava lendo seu comentário errado. Você está certo, .values é bom, .level desatualiza e get_values fornece os valores atuais, excluindo corretamente as linhas / colunas eliminadas. Problema original no github: github.com/pydata/pandas/issues/3686 Mas eu apenas verifiquei e parece que .values (é claro!) Fornece informações atualizadas apenas de uma forma diferente da que eu pensava
Ezekiel Kruglick
1
@AndyHayden Não, não há diferença. get_valuesapenas liga .values. São mais caracteres para digitar.
cs95
0
Eu converti os pandas dataframepara liste depois usei o básico list.index(). Algo assim:
dd = list(zone[0])#Where zone[0] is some specific column of the table
idx = dd.index(filename[i])
Abaixo está uma maneira simples de converter a coluna do quadro de dados em uma matriz numpy.
df = pd.DataFrame(somedict)
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])
ytrain_numpy é uma matriz numpy.
Eu tentei com, to.numpy()mas ele me deu o erro abaixo:
TypeError: nenhuma conversão suportada para tipos: (dtype ('O'),) enquanto fazia a classificação de classificação de relevância binária usando o Linear SVC. to.numpy () estava convertendo o dataFrame em uma matriz numpy, mas o tipo de dados do elemento interno estava listado, pelo que o erro acima foi observado.
Eu tentei com to.numpy (), mas ele me deu o erro abaixo: TypeError: nenhuma conversão suportada para tipos: (dtype ('O'),) enquanto fazia a classificação de classificação de relevância binária usando o SVC linear. to.numpy () estava convertendo o dataFrame em uma matriz numpy, mas o tipo de dados do elemento interno estava listado, pelo que o erro acima foi observado. Isso não é realmente culpa de to_numpy, no entanto.
Respostas:
Para obter uma matriz NumPy, você deve usar o
values
atributo:Isso acessa como os dados já estão armazenados, portanto, não há necessidade de conversão.
Nota: Este atributo também está disponível para muitos outros objetos dos pandas.
Para obter o índice como uma lista, ligue para
tolist
:E da mesma forma, para colunas.
fonte
.values
está obsoleta,.to_numpy()
é a substituição sugerida se você deseja uma matriz NumPy. Você pode expandir Isso acessa como os dados já estão armazenados, para que não haja necessidade de conversão ?.values
,.to_numpy()
e.array
.Você pode usar
df.index
para acessar o objeto de índice e obter os valores em uma lista usandodf.index.tolist()
. Da mesma forma, você pode usar odf['col'].tolist()
Series.fonte
df.index.values.tolist()
df.index.tolist()
não retorna um método de instância. Retorna uma lista de índices. É um método definido no índice de pandas. Embora chamar valores seja uma possibilidade, delegar o trabalho a numpy não é uma correção - apenas uma alternativa.pandas> = 0,24
Descontinue seu uso
.values
em favor desses métodos!De v0.24.0 em diante, teremos dois métodos marca muito novo, preferidos para a obtenção de matrizes Numpy partir
Index
,Series
eDataFrame
objetos: eles sãoto_numpy()
, e.array
. Em relação ao uso, os documentos mencionam:Consulte esta seção das notas da versão v0.24.0 para obter mais informações.
to_numpy()
MétodoPor padrão, uma exibição é retornada. Quaisquer modificações feitas afetarão o original.
Se você precisar de uma cópia, use
to_numpy(copy=True
);Observe que essa função também funciona para DataFrames (enquanto
.array
não).array
AtributoEste atributo retorna um
ExtensionArray
objeto que faz backup do Índice / Série.A partir daqui, é possível obter uma lista usando
list
:ou ligue diretamente para
.tolist()
:Em relação ao que é retornado, os documentos mencionam,
Então, para resumir,
.array
retornaráExtensionArray
suporte existente ao Index / Series, ouExtensionArray
objeto será criado como um invólucro fino sobre a matriz subjacente.Justificativa para adicionar DOIS novos métodos
Essas funções foram adicionadas como resultado de discussões em dois problemas do GitHub, GH19954 e GH23623 .
Especificamente, os documentos mencionam a lógica:
Essas duas funções visam melhorar a consistência da API, que é um passo importante na direção certa.
Por fim,
.values
não será descontinuado na versão atual, mas espero que isso aconteça em algum momento no futuro, por isso, exortaria os usuários a migrarem para a API mais recente o mais rápido possível.fonte
Se você estiver lidando com um quadro de dados com vários índices, poderá estar interessado em extrair apenas a coluna de um nome do multi-índice. Você pode fazer isso como
e, claro,
name_sub_index
deve ser um elemento doFrozenList
df.index.names
fonte
Desde o pandas v0.13, você também pode usar
get_values
:fonte
get_values
apenas liga.values
. São mais caracteres para digitar.Eu converti os pandas
dataframe
paralist
e depois usei o básicolist.index()
. Algo assim:Você tem seu valor de índice como
idx
.fonte
Uma maneira mais recente de fazer isso é usar a função .to_numpy ().
Se eu tiver um quadro de dados com uma coluna 'preço', posso convertê-lo da seguinte maneira:
Você também pode passar o tipo de dados, como float ou objeto, como argumento da função
fonte
Abaixo está uma maneira simples de converter a coluna do quadro de dados em uma matriz numpy.
ytrain_numpy é uma matriz numpy.
Eu tentei com,
to.numpy()
mas ele me deu o erro abaixo: TypeError: nenhuma conversão suportada para tipos: (dtype ('O'),) enquanto fazia a classificação de classificação de relevância binária usando o Linear SVC. to.numpy () estava convertendo o dataFrame em uma matriz numpy, mas o tipo de dados do elemento interno estava listado, pelo que o erro acima foi observado.fonte
to_numpy
, no entanto.