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?



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.


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.

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.


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


16

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

df.index.get_values()

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.


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


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.