2017-06-27 4 views
1

J'ai quelques questions ici. Je suis nouveau pour les pandas si nue avec moi. J'ai chargé dans une base de données avec un certain nombre de colonnes, dont une comprend une adresse. J'utilise un module géocodeur python pour obtenir lat/long pour chaque adresse dans ce csv.Python: Ajout de colonnes aux données pandas et itérer dans l'une des colonnes

Pandas

1) Comment puis-je ajouter de nouvelles colonnes? Dois-je ajouter les colonnes au fur et à mesure que je parcourt les rangées, ou devrais-je ajouter des colonnes au début?

2) Dans mon code ci-dessous, j'essaie de parcourir toutes les lignes de la trame de données. Pour chaque ligne, j'effectue la méthode geocoder.google(). La colonne 16 de ma trame csv/data contient une adresse.

Comment faire référence à cette colonne d'adresse en parcourant toutes les lignes? J'obtiens "IndexError: index de tuple hors de portée" si je cours le code tel qu'il est.

CSV

3) La 2ème partie de mon code fait une chose similaire avec les modules CSV. Je lis dans un CSV, boucle à travers chaque rangée et exécute la méthode de geocoder comme indiqué précédemment. La méthode du géocodeur renvoie une liste de 2 valeurs (2 coordonnées - [XXXX, XXXX]). J'essaie d'écrire dans les lignes d'origine, puis deux autres colonnes avec chacune des deux coordonnées après. Je reçois « TypeError: ne peut concaténer liste (non « float ») à la liste »

import geocoder 
import csv 
import pandas as pd 
import time 

df = pd.read_csv("RSM100_1995.csv",header=None) 
print(df.head()) 
for row in df.iterrows(): 
    g = geocoder.google(row[16]) 
    print(row[16],g.latlng) 
    time.sleep(2) 

with open("RSM100_1995.csv","r") as f, open("RSM_GCTest.csv","w",newline='') as g: 
    rdr = csv.reader(f) 
    wtr = csv.writer(g) 
    for r in rdr: 
     gc = geocoder.google(str(r[16])) 
     print(r[16],gc.latlng) 
     wtr.writerow(r + gc.latlng[0]+gc.latlng[1]) 
     time.sleep(2) 

Soit dit en passant, je me sers time.sleep (2) depuis le géocodage a une limite au nombre de demandes . Je ne lance pas le code tel qu'il est ici, juste le mettre comme ça pour l'afficher.

Si quelqu'un a une meilleure façon de géocoder les adresses britanniques en utilisant Python, faites le moi savoir.


Edit:

Pour Chirag - J'ai fait les changements que vous avez mentionnés. J'ai essayé de remplacer "Adresse" dans le code ci-dessous avec l'index de la colonne (qui est 16) avec le même résultat.

J'ai ajouté des en-têtes de colonnes avec X.columns

Je suis maintenant obtenir un très long message d'erreur qui relie de nombreux fichiers différents.

RS1995 = pd.read_csv("RSM100_1995.csv",header=None) 

RS1995.columns = ['ID','Price','Date','Postcode','X','Y','Z','PAON','SAON','Street','Locality','District','City','County','A','B','Address','XX'] 
print(RS1995.head()) 
for row in RS1995.iterrows(): 
    RS1995['lat'] = geocoder.google(RS1995['Address']).latlng[0] 
    RS1995['lng'] = geocoder.google(RS1995['Address']).latlng[1] 
    print(RS1995.head()) 
    time.sleep(2) 

En termes de CSV - il y a 17 colonnes, je les ai nommées ci-dessus. La colonne "Adresse" est celle que je veux traverser le géocodeur. La colonne Adresse elle-même est une concaténation de 'PAON', 'SAON', 'Rue', 'Localité', 'Comté' & 'Code postal'. J'aurais pu inclure 'City' aussi, mais toute la concaténation que j'ai faite en utilisant le module CSV.

Si elle aide - voici le lien géocodage:

http://geocoder.readthedocs.io/


Edit 2:

RS1995 = pd.read_csv("RSM100_1995.csv",header=None) 

RS1995.columns = ['ID','Price','Date','Postcode','X','Y','Z','PAON','SAON','Street','Locality','District','City','County','A','B','Address','XX'] 
print(RS1995.head()) 

RS1995['lat'] = "x" 
RS1995['lng'] = "y" 
print(RS1995.head()) 
for row in RS1995.iterrows(): 
    print(row) 

Chaque fois que je lance ce code ci-dessus, je reçois cela. Je viens de prendre les deux derniers exemples. Qu'est-ce que ça veut dire? Comment puis-je iterrate à travers chaque ligne, géocodage l'adresse et attendre 2 secondes, donc je ne dépasse pas la limite de vitesse ?:

(98, ID      {40E4DAC0-863F-42FE-94B4-49A70D3BE0B9} 
Price             43000 
Date           24/02/1995 00:00 
Postcode            WS12 3XJ 
X               S 
Y               N 
Z               F 
PAON              1 
SAON              NaN 
Street           WOODFORD WAY 
Locality           HEATH HAYES 
District            CANNOCK 
City           CANNOCK CHASE 
County           STAFFORDSHIRE 
A               A 
B               A 
Address  1 WOODFORD WAY HEATH HAYES STAFFORDSHIRE WS12... 
XX   1 WOODFORD WAY HEATH HAYES STAFFORDSHIRE WS12... 
lat               x 
lng               y 
Name: 98, dtype: object) 
(99, ID     {061625F8-82D5-43CF-A55F-4288979D31EC} 
Price            42995 
Date          01/09/1995 00:00 
Postcode           PO1 5AY 
X              T 
Y              N 
Z              F 
PAON             67 
SAON             NaN 
Street          BYERLEY ROAD 
Locality          PORTSMOUTH 
District          PORTSMOUTH 
City           PORTSMOUTH 
County           PORTSMOUTH 
A              A 
B              A 
Address  67 BYERLEY ROAD PORTSMOUTH PORTSMOUTH PO1 5AY 
XX   67 BYERLEY ROAD PORTSMOUTH PORTSMOUTH PO1 5AY 
lat              x 
lng              y 
Name: 99, dtype: object) 

Répondre

0

Vous pouvez créer de nouvelles colonnes dans une trame de données de pandas géants semblable à la façon dont vous utilisez un associative tableau ou dictionnaire. Vous pouvez créer deux nouvelles colonnes pour votre latitude et la longitude comme ceci:

df['lat'] = geocoder.google(df[16]).latlng[0] 
df['lng'] = geocoder.google(df[16]).latlng[1] 

alors vous pouvez écrire tout le dataframe à un csv:

df.to_csv('RSM_GCTest.csv') 
+0

Cela semble que cela fonctionnerait, mais la réception d'une longue liste de Erreurs telles que: – christaylor

+0

ValueError: La valeur de vérité d'une série est ambiguë. Utilisez a.empty, a.bool(), a.item(), a.any() ou a.all(). – christaylor

+0

C'est très intéressant. Je ne sais pas pourquoi vous obtenez ces erreurs parce que nous n'essayons pas d'évaluer la finesse d'une série. Cependant, pouvez-vous me montrer comment vous avez construit votre fichier csv d'entrée? Je peux essayer de l'exécuter localement. – Chirag