0
votes

Comment diviser une cellule qui contient une matrice imbriquée dans un fichier de données Pandas

J'ai un Dataframe Pandas, qui contient 610 lignes, et chaque ligne contient une liste imbriquée de paires de coordonnées, on dirait que: Entrez la description de l'image ici

[1377778.4800000004, 6682395.377599999] est une paire de coordonnées.

Je veux inhorter chaque rangée, donc au lieu d'une ligne contenant une liste de coordonnées, j'aurai une ligne pour chaque paire de coordonnées, c'est-à-dire.:

Entrez la description de l'image ici

J'ai essayé s.Apply (PD.Series) .stact () de cette question Split des valeurs de matrice imbriquées de Pandas DataFrame Cell sur plusieurs rangées mais malheureusement cela n'a pas fonctionné.

S'il vous plaît des idées? Merci beaucoup d'avance!


1 commentaires

Pourriez-vous ajouter une copie de vos données pouvant être collées collées?


3 Réponses :


0
votes
    coord
0  [0, 1]
1  [2, 3]
2  [4, 5]
3  [6, 7]
4  [8, 9]


   x  y
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

0 commentaires

0
votes

Une chose que vous pouvez faire est d'utiliser NUMPY. Il vous permet d'effectuer de nombreuses opérations de liste / de tableau de manière rapide et efficace. Cela inclut des listes «inhormes» (Reshaping). Ensuite, vous devez seulement convertir en Pandas Dataframe.

Par exemple, P>

import numpy as np

#your list
coordinate_list = [[[1377778.4800000004, 6682395.377599999],[6582395.377599999, 2577778.4800000004], [6582395.377599999, 2577778.4800000004]]]

#convert list to array
coordinate_array = numpy.array(coordinate_list)
#print shape of array 
coordinate_array.shape

#reshape array into pairs of 
reshaped_array = np.reshape(coordinate_array, (3, 2))

df = pd.DataFrame(reshaped_array)
df.columns = ['X', 'Y']


1 commentaires

J'essaie d'obtenir ces coordonnées d'Arcgis. Il ressemble à ceci: dans: geometry_list = [] pour RSLT dans ['Caractéristiques']: gm = np.array (RSLT ["geometry"] ['Rings']) géométry_list.append (GM) Out: [Array ( Il y ait une liste avec 610 tableaux, chacun contient diff. Nombre de paires de coordintes, présentées comme des tableaux ... Lorsque j'essaie de convertir la liste en tableau, je Obtenez une erreur suivante: coordonnée_array = np.array (géométrie_list) ValueError: Impossible de diffuser la matrice d'entrée de la forme (115,2) en forme (1)



0
votes

Voici ma nouvelle réponse à votre problème. J'ai utilisé "Réduire" pour aplatir votre tableau imbriqué, puis j'ai utilisé la "chaîne iTerTools" pour tout transformer en une liste 1D. Après cela, j'ai remodelé la liste dans un tableau 2D qui vous permet de la convertir en DataFrame dont vous avez besoin. J'ai essayé d'être aussi générique que possible. S'il vous plaît laissez-moi savoir s'il y a des problèmes.

#libraries
import operator
from functools import reduce
from itertools import chain

#flatten lists of lists using reduce. Then turn everything into a 1d list using 
#itertools chain.
reduced_coordinates = list(chain.from_iterable(reduce(operator.concat, 
geometry_list)))

#reshape the coordinates 1d list to a 2d and convert it to a dataframe
df = pd.DataFrame(np.reshape(reduced_coordinates, (-1, 2)))
df.columns = ['X', 'Y']


6 commentaires

Merci beaucoup! Cela a fonctionné! Je suis vraiment reconnaissant :)


En fait, il ne fonctionnait que pour l'un des 610 matrices (une matrice ressemble à [[[[1377909.0626 6696341.0589], [1377913.8088 6696326.7092], ...]]]] Mais pour ma géométry_list, qui est déjà une liste de 610 tableaux de ce type et que la forme [Array1 ([[[[...]]]]), Array2 ([[[[...]]]), ... Array610 ([[ [...]]]]] ça ne marche toujours pas ...


Le problème est également que les matrices de THERSE ont des longueurs différentes, donc je reçois ValueError: les opérandes ne pouvaient pas être diffusées avec des formes (1 115,2) (1 1434,2) - Array1 se compose de 115 paires de coordonnées et Array2 a 134 paires.


Eh bien, j'ai modifié un peu vos conseils, et maintenant ça marche))) Merci beaucoup: DDD


Hey, content que cela fonctionne pour vous maintenant :)) N'hésitez pas à donner ma réponse et upvote si vous l'avez aimé


Oui, j'ai essayé de uppoter, mais je n'ai malheureusement pas assez de réputation pour faire mon vote visible publiquement