Como faço para converter uma série ou índice de pandas em uma matriz Numpy?

264

Você sabe como obter o índice ou a coluna de um DataFrame como uma matriz NumPy ou lista python?

ericmjl
fonte
Isso responde sua pergunta? Converter panda dataframe em NumPy array
AMC
1
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  1  4
b  2  5
c  3  6

In [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.

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

Para obter o índice como uma lista, ligue para tolist:

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

E da mesma forma, para colunas.

Andy Hayden
fonte
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.

bdiamante
fonte
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.

Consulte esta seção das notas da versão v0.24.0 para obter mais informações.


to_numpy() Método

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

Por padrão, uma exibição é retornada. Quaisquer modificações feitas afetarão o original.

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

Se você precisar de uma cópia, use to_numpy(copy=True);

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

Observe que essa função também funciona para DataFrames (enquanto .arraynão).


arrayAtributo
Este atributo retorna umExtensionArrayobjeto que faz backup do Índice / Série.

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

A partir daqui, é possível obter uma lista usando list:

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

ou ligue diretamente para .tolist():

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

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á

  1. O ExtensionArraysuporte existente ao Index / Series, ou
  2. 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.

cs95
fonte
48

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 doFrozenList df.index.names

gg349
fonte
16

Desde o pandas v0.13, você também pode usar get_values:

df.index.get_values()
yemu
fonte
5
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])

Você tem seu valor de índice como idx.

Sarvagya Gupta
fonte
e depois usou a lista básica.index () Como isso está relacionado à questão de converter uma série em uma lista?
AMC
0

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:

priceArray = df['price'].to_numpy()

Você também pode passar o tipo de dados, como float ou objeto, como argumento da função

Jon R
fonte
-1

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.

Kumar Shubham
fonte
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.
AMC