Je souhaite créer une nouvelle trame de données pandas à colonne unique à l'aide d'un tableau numpy 2D. Apparemment, chaque ligne devrait contenir des listes 1D. Voici un exemple reproductible simplifié.

import pandas as pd
import numpy as np

arr = np.ones((4,3)) # could be any 2D array

Ce que je veux c'est,

       lists
0  [1, 1, 1]
1  [1, 1, 1]
2  [1, 1, 1]
3  [1, 1, 1]

Maintenant, df = pd.DataFrame(arr, columns=['lists']) donne l'erreur,

ValueError: Shape of passed values is (4, 3), indices imply (4, 1)

Et df = pd.DataFrame(list(arr), columns=['lists']) donne l'erreur,

ValueError: 1 columns passed, passed data had 3 columns

Enfin, df = pd.DataFrame(arr.flatten(), columns=['lists']) donne une trame de données erronée avec toutes les cellules ayant un scalaire 1.

Comment obtenir ce que je veux?

4
Achintha Ihalage 28 mai 2020 à 22:21

3 réponses

Meilleure réponse

À partir de chaque ligne du tableau 2d (c'est-à-dire un tableau 1d), construisez un tuple singleton qui contient cette ligne et construisez le DataFrame à partir de cela . Nous pouvons le faire avec élégance en utilisant une expression de générateur:

>>> df = pd.DataFrame(((x,) for x in arr), columns=['lists'])
>>> df
             lists
0  [1.0, 1.0, 1.0]
1  [1.0, 1.0, 1.0]
2  [1.0, 1.0, 1.0]
3  [1.0, 1.0, 1.0]

Le constructeur effectue une itération sur le tuple, plutôt que sur le tableau sous-jacent, afin de déterminer les valeurs de colonne dans une ligne donnée. Il existe une telle valeur - le tableau 1d - qui est donc stockée pour cette ligne dans la seule colonne disponible.

Les valeurs des cellules sont en effet des tableaux Numpy:

>>> df['lists'][0]
array([1., 1., 1.])
2
Karl Knechtel 28 mai 2020 à 19:37
data = {"lists": list(arr)}

df = pd.DataFrame(data, columns=['lists'])

print(df)

Production:

             lists
0  [1.0, 1.0, 1.0]
1  [1.0, 1.0, 1.0]
2  [1.0, 1.0, 1.0]
3  [1.0, 1.0, 1.0]
2
Anshul 28 mai 2020 à 19:44

Obtenez toutes les lignes du tableau, créez un dataframe avec elles. Transposez puis ajoutez le nom de la colonne.

import pandas as pd
import numpy as np

# ones array
arr = np.ones((4,3), dtype=int)

# get all rows of the array transpose and add column name
df  = pd.DataFrame([list(arr)]).T
df.columns = ['lists']
df
2
Sheila Mbadi 28 mai 2020 à 19:48