Estou interessado em saber como converter um dataframe de pandas em uma matriz NumPy.
quadro de dados:
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
dá
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
Gostaria de converter isso em uma matriz NumPy, da seguinte maneira:
array([[ nan, 0.2, nan],
[ nan, nan, 0.5],
[ nan, 0.2, 0.5],
[ 0.1, 0.2, nan],
[ 0.1, 0.2, 0.5],
[ 0.1, nan, 0.5],
[ 0.1, nan, nan]])
Como posso fazer isso?
Como bônus, é possível preservar os tipos, assim?
array([[ 1, nan, 0.2, nan],
[ 2, nan, nan, 0.5],
[ 3, nan, 0.2, 0.5],
[ 4, 0.1, 0.2, nan],
[ 5, 0.1, 0.2, 0.5],
[ 6, 0.1, nan, 0.5],
[ 7, 0.1, nan, nan]],
dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
ou similar?
Respostas:
Para converter um quadro de dados do pandas (df) em um ndarray numpy, use este código:
fonte
Preterir o uso de
values
eas_matrix()
!O pandas v0.24.0 introduziu dois novos métodos para obter matrizes NumPy a partir de objetos pandas:
to_numpy()
, que é definido emIndex
,Series,
eDataFrame
objetos, earray
, que é definido apenasIndex
eSeries
objetos.Se você visitar os documentos da v0.24 para
.values
, verá um grande aviso vermelho dizendo:Consulte esta seção das notas da versão v0.24.0 e esta resposta para obter mais informações.
Rumo a uma melhor consistência:
to_numpy()
No espírito de melhor consistência em toda a API, um novo método
to_numpy
foi introduzido para extrair a matriz NumPy subjacente dos DataFrames.Como mencionado acima, este método também é definido em
Index
eSeries
objetos (veja aqui ).Por padrão, uma exibição é retornada, portanto, quaisquer modificações feitas afetarão o original.
Se você precisar de uma cópia, use
to_numpy(copy=True
).pandas> = 1.0 atualização para ExtensionTypes
Se você estiver usando o pandas 1.x, é provável que esteja lidando com tipos de extensão muito mais. Você precisará ter um pouco mais de cuidado para que esses tipos de extensão sejam convertidos corretamente.
Isso é mencionado nos documentos .
Se você precisar do
dtypes
...Como mostrado em outra resposta,
DataFrame.to_records
é uma boa maneira de fazer isso.to_numpy
Infelizmente, isso não pode ser feito . No entanto, como alternativa, você pode usarnp.rec.fromrecords
:Em termos de desempenho, é quase o mesmo (na verdade, usar
rec.fromrecords
é um pouco mais rápido).Justificativa para adicionar um novo método
to_numpy()
(além dearray
) foi adicionado como resultado de discussões em duas edições do GitHub GH19954 e GH23623 .Especificamente, os documentos mencionam a lógica:
to_numpy
visam melhorar a consistência da API, que é um passo importante na direção certa..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 assim que possível.Crítica de outras soluções
DataFrame.values
tem comportamento inconsistente, como já observado.DataFrame.get_values()
é simplesmente um invólucroDataFrame.values
, então tudo o que foi dito acima se aplica.DataFrame.as_matrix()
está obsoleto agora, NÃO use!fonte
as_matrix
para outra solução, neste caso,to_numpy
sem explicar como recuperar a funcionalidade de seleção da colunaas_matrix
! Tenho certeza de que existem outras maneiras de selecionar colunas, masas_matrix
era pelo menos uma delas!df[[col1, col2']].to_numpy()
? Não sabe por que você acha que querer anunciar uma alternativa atualizada a uma função obsoleta justifica um voto negativo na resposta.Nota : O
.as_matrix()
método usado nesta resposta está obsoleto. O Pandas 0.23.4 adverte:Pandas tem algo construído em ...
dá
fonte
object
.to_numpy
vez disso (.values
também não ). Mais aqui .Gostaria apenas de encadear as funções DataFrame.reset_index () e DataFrame.values para obter a representação Numpy do quadro de dados, incluindo o índice:
Para obter os tipos, precisamos transformar esse ndarray em uma matriz estruturada usando view :
fonte
Você pode usar o
to_records
método, mas precisa brincar um pouco com os tipos, se eles não forem o que você deseja desde o início. No meu caso, depois de copiar seu DF de uma string, o tipo de índice é string (representado por umobject
dtype no pandas):Converter o dtype de recarray não funciona para mim, mas já é possível fazer isso no Pandas:
Observe que o Pandas não define o nome do índice corretamente (para
ID
) na matriz de registros exportados (um bug?), Portanto, aproveitamos a conversão de tipos para também corrigir isso.No momento, o Pandas possui apenas números inteiros de 8 bytes
i8
, e floatsf8
(consulte esta edição ).fonte
np.array
construtor.Parece que
df.to_records()
vai funcionar para você. O recurso exato que você estava procurando foi solicitado eto_records
apontado como alternativa.Eu tentei isso localmente usando o seu exemplo, e essa chamada gera algo muito semelhante à saída que você estava procurando:
Observe que este é um
recarray
e não umarray
. Você pode mover o resultado para uma matriz numpy regular chamando seu construtor comonp.array(df.to_records())
.fonte
to_records()
mais de 5 anos antes?Tente o seguinte:
fonte
Aqui está minha abordagem para criar uma matriz de estrutura a partir de um DataFrame do pandas.
Crie o quadro de dados
Defina a função para criar uma matriz de estrutura numpy (não uma matriz de registros) de um DataFrame do pandas.
Use
reset_index
para criar um novo quadro de dados que inclua o índice como parte de seus dados. Converta esse quadro de dados em uma matriz de estrutura.EDIT: Atualizado df_to_sarray para evitar erros ao chamar .encode () com python 3. Agradecemos a Joseph Garvin e halcyon por seus comentários e soluções.
fonte
Duas maneiras de converter o quadro de dados em sua representação numpy-array.
mah_np_array = df.as_matrix(columns=None)
mah_np_array = df.values
Doc: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html
fonte
Uma maneira mais simples para o exemplo DataFrame:
USAR:
PEGUE:
fonte
Só tive um problema semelhante ao exportar do dataframe para a tabela arcgis e deparei com uma solução da usgs ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table ). Em suma, seu problema tem uma solução semelhante:
fonte
Eu passei pelas respostas acima. O método " as_matrix () " funciona, mas está obsoleto agora. Para mim, o que funcionou foi " .to_numpy () ".
Isso retorna uma matriz multidimensional. Prefiro usar esse método se você estiver lendo dados da planilha do Excel e precisar acessar dados de qualquer índice. Espero que isto ajude :)
fonte
Além da resposta do meteore, encontrei o código
não funciona para mim. Então, coloquei meu código aqui para conveniência de outras pessoas envolvidas com esse problema.
fonte
Uma maneira simples de converter o quadro de dados em matriz numpy:
O uso de to_numpy é recomendado para preservar a consistência.
Referência: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html
fonte
Tente o seguinte:
Mais informações em: [ https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html] Válido para numpy 1.16.5 e pandas 0.25.2.
fonte