web-dev-qa-db-fra.com

Convertissez numpy array en pandas dataframe

J'ai un tableau numpy de taille 31x36 et je souhaite me transformer en pandas dataframe afin de le traiter. J'essaye de le convertir en utilisant le code suivant:

pd.DataFrame(data=matrix,
          index=np.array(range(1, 31)),
          columns=np.array(range(1, 36)))

Cependant, je reçois l'erreur suivante:

ValueError: la forme des valeurs transmises est (36, 31), les indices impliquent (35, 30)

Comment puis-je résoudre le problème et le transformer correctement?

5
konstantin

Quant à pourquoi ce que vous avez essayé a échoué, les plages sont désactivées de 1

pd.DataFrame(data=matrix,
          index=np.array(range(1, 32)),
          columns=np.array(range(1, 37)))

Comme la dernière valeur n'est pas incluse dans la plage

En fait, en regardant ce que vous faites, vous auriez pu faire:

pd.DataFrame(data=matrix,
          index=np.arange(1, 32)),
          columns=np.arange(1, 37)))

Ou en pure pandas:

pd.DataFrame(data=matrix,
          index=pd.RangeIndex(range(1, 32)),
          columns=pd.RangeIndex(range(1, 37)))

De même, si vous ne spécifiez pas les paramètres d'index et de colonne, un index et des colonnes générés automatiquement sont générés à partir de 0. Vous ne savez pas pourquoi vous avez besoin d'eux pour commencer à partir de 1

Vous pourriez également ne pas avoir passé les paramètres index et column et simplement les modifier après la construction:

In[9]:
df = pd.DataFrame(adaption)
df.columns = df.columns+1
df.index = df.index + 1
df

Out[9]: 
          1         2         3         4         5         6
1 -2.219072 -1.637188  0.497752 -1.486244  1.702908  0.331697
2 -0.586996  0.040052  1.021568  0.783492 -1.263685 -0.192921
3 -0.605922  0.856685 -0.592779 -0.584826  1.196066  0.724332
4 -0.226160 -0.734373 -0.849138  0.776883 -0.160852  0.403073
5 -0.081573 -1.805827 -0.755215 -0.324553 -0.150827 -0.102148
4
EdChum

En plus de la réponse ci-dessus, range(1, X) décrit l'ensemble des nombres allant de 1 à X-1 inclus. Vous devez utiliser range(1, 32) et range(1, 37) pour faire ce que vous décrivez.

1
ACascarino

Vous rencontrez une erreur car l'argument end dans range(start, end) est non inclusif . Vous avez plusieurs options à prendre en compte pour cela:

Ne passez pas l'index et les colonnes

Utilisez simplement df = pd.DataFrame(matrix). Le constructeur pd.DataFrame ajoute implicitement des indices entiers.

Passer dans la forme du tableau

matrix.shape donne un nuplet de nombre de lignes et de colonnes, vous n'avez donc pas besoin de les spécifier manuellement. Par exemple:

df = pd.DataFrame(matrix, index=range(matrix.shape[0]),
                          columns=range(matrix.shape[1]))

Si vous devez commencer par 1, n'oubliez pas d'ajouter 1:

df = pd.DataFrame(matrix, index=range(1, matrix.shape[0] + 1),
                          columns=range(1, matrix.shape[1] + 1))
1
jpp