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)
Cela semble que cela fonctionnerait, mais la réception d'une longue liste de Erreurs telles que: – christaylor
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
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