J'ai un fichier csv formaté comme suit:

Image Id,URL,Latitude,Longitude
17609472165,https://farm8.staticflickr.com/7780/17609472165_c44d9b5a0e_q.jpg,48.843226,2.31805
11375512374,https://farm6.staticflickr.com/5494/11375512374_66a4d9af6c_q.jpg,48.844166,2.376
24768920940,https://farm2.staticflickr.com/1571/24768920940_634cc06f43_q.jpg,48.844619,2.395897
9411072065,https://farm8.staticflickr.com/7368/9411072065_5e2083a32e_q.jpg,48.844666,2.3725
9996916356,https://farm3.staticflickr.com/2807/9996916356_640c493020_q.jpg,48.844666,2.3725
24281266199,https://farm2.staticflickr.com/1623/24281266199_bf63e25c23_q.jpg,48.844925,2.389616

Je veux importer ce fichier et pour chaque ligne du fichier, ajouter un point lat et lon à un tableau 2D. J'ai essayé du code tel que le suivant et cela ne fonctionne pas (ou n'imprime rien) et donne l'erreur "ValueError: toutes les dimensions du tableau d'entrée sauf l'axe de concaténation doivent correspondre exactement"

import numpy

data  = open('dataset_import_noaddress', 'r')
A = []

for line in data:
    fields = line.strip().split(',')
    lat = fields[2]
    lon = fields[3]
    print lat
    print lon
    newrow = [lat, lon]
    A = numpy.vstack([A, newrow])

Quelqu'un peut-il suggérer pourquoi cela ne fonctionne pas ou encore mieux suggérer une meilleure façon de réaliser la même chose. Merci!

1
RyanKilkelly 7 mars 2016 à 19:29

3 réponses

Meilleure réponse

Vous voulez simplement lire votre csv dans une matrice avec chaque latitude, longitude de ligne. Donc, fondamentalement, lisez, supprimez les 2 premières colonnes

Code

import numpy as np

input = np.genfromtxt(open("dataset.csv","rb"),delimiter=",", skip_header=1)
A = np.delete(input, [0,1], 1)

print(A)

Il lit simplement le csv toutes les valeurs non flottantes sont converties en nan. Ensuite, supprimez simplement les 2 premières colonnes avec np.delete

Sortie

[[ 48.843226   2.31805 ]
 [ 48.844166   2.376   ]
 [ 48.844619   2.395897]
 [ 48.844666   2.3725  ]
 [ 48.844666   2.3725  ]
 [ 48.844925   2.389616]]
1
Kordi 7 mars 2016 à 17:20

Donc, fondamentalement, vous voulez les données lat et longues du fichier csv, n'est-ce pas? Je suggère que vous utilisiez pandas' read_csv(), de cette façon, il n'est pas nécessaire de boucler le fichier ligne par ligne. Les pandas peuvent gérer toutes les colonnes à la fois.

import pandas as pd

file_ = pd.read_csv("dataset_import_noaddress", sep = ',')
A = np.array(file_[["Latitude", "Longitude"]])
print A

array([[ 48.843226, 2.31805 ], [ 48.844166, 2.376 ], [ 48.844619, 2.395897], [ 48.844666, 2.3725 ], [ 48.844666, 2.3725 ], [ 48.844925, 2.389616]])

1
bninopaul 7 mars 2016 à 16:54

Tout d'abord, vous souhaitez généralement utiliser un format with open(filename, 'r') as ...:. Une des raisons à cela est que le fichier sera automatiquement fermé si vous rencontrez une erreur.

On utilise souvent csv.reader pour lire les fichiers csv en Python ( bien que vous puissiez également lire le tableau en utilisant pd.read_csv (...) si vous utilisez des Pandas). Vous devez ensuite parcourir le lecteur à l'aide de for line in reader:.

Vous obtenez des variables uniques et créez des listes intermédiaires, en utilisant numpy.vstack pour chaque ligne. Il serait plus efficace de tout agréger sous forme de liste, puis d'appeler vstack sur la liste entière.

A.append(line[2:4]) prend les troisième et quatrième éléments de la liste sur la ligne donnée (par exemple [48.843226, 2.31805]) et les ajoute à la liste plus grande A. Vous devez d'abord vous assurer que la ligne a au moins quatre valeurs avant d'ajouter, en gardant trace des mauvaises lignes.

Une fois A construit, vous appelez alors vstack.

import csv

with open(filename, 'r') as f:
    A = []
    bad_lines = []
    reader = csv.reader(f)
    for line in reader:
        if len(line) == 4:
            A.append(line[2:4])
        else:
            bad_lines.append(line)
    A = np.vstack(A)
2
Alexander 7 mars 2016 à 17:01