3
votes

Extraction d'un élément du tableau pandas de type tableau numpy

J'ai un dataframe pandas df dont les éléments sont chacun un tableau numpy entier. Par exemple, la 6ème ligne de la colonne 'x_grid':

>>> print(type(e))

<class 'str'>

Mais je ne peux pas l'utiliser comme un tableau numpy car il est simplement donné sous forme de chaîne: p >

>>> e = df.loc[6,'x_grid']
>>> print(e)

[-11.52616579 -11.48006112 -11.43395646 -11.3878518  -11.34174713
 -11.29564247 -11.24953781 -11.20343315 -11.15732848 -11.11122382
 -11.06511916 -11.01901449 ...

Comment puis-je stocker un tableau numpy dans un dataframe afin qu'il ne soit pas converti en chaîne? Ou reconvertir cette chaîne en un tableau numpy d'une manière agréable?


4 commentaires

Il convient de noter que ce DataFrame est chargé à partir d'un fichier csv, ce qui est sans aucun doute l'endroit où la conversion en chaîne se produit. Je suppose donc que la conversion de cette chaîne en un tableau numpy serait la voie la plus facile.


De plus, il n'y a pas de virgules pour séparer les éléments de votre tableau.


Regardez le fichier texte source. Ce tableau est une chaîne entre guillemets, complétée par [] , y a-t-il aussi ... ? Le dataframe d'origine contenait ces éléments de tableau, et la seule façon d'enregistrer un tel df dans un format csv 2d est de transformer les éléments complexes en chaînes. les pandas ont utilisé str (item) . Dans la mesure du possible, évitez de sauvegarder ces dataframes au format csv.


Cela s'est produit plusieurs fois, par exemple stackoverflow.com/ questions / 51898099 /… . literal_eval peut avoir des problèmes avec votre chaîne car il manque les virgules qui marquent normalement une liste.


3 Réponses :


0
votes

Si vous souhaitez simplement convertir toutes ces chaînes de chaque ligne en une liste, ce qui suit fonctionnera:

df['x_grid'].str[1:-1].str.split(" ").apply(lambda x: (list(map(float, x))))

# or for a numpy array
df['x_grid'].str[1:-1].str.split(" ").apply(lambda x: (np.array(list(map(float, x)))))

J'espère que cela vous aidera.


0 commentaires

0
votes

Merci à Erfan et hpaulj pour les suggestions combinées pour répondre à cette question.

La solution est que lors de la définition d'un élément du dataframe, je convertis d'abord le tableau numpy x en liste (donc il est séparé par des virgules et non par des espaces):

x = np.array(ast.literal_eval(df.loc[entry,'x_grid']))

Ensuite, après avoir enregistré dans un csv et rechargé, je l'extraye à nouveau dans un tableau numpy en utilisant np.array () et ast.literal_eval () (Remarque: nécessite import ast ):

df = df.append({'x_grid': list(x)}, ignore_index=True)

Ceci renvoie alors un tableau numpy correct x .


0 commentaires

0
votes

Vous voulez étendre la réponse de Rafal pour éviter de lancer une exception numpy à partir de chaînes vides résultant de x.split:

df['x_grid'].str[1:-1].apply(lambda x: list(filter(None,x.split(' ')))).apply(lambda x: np.array(x).astype(np.float))


0 commentaires