我在這裏有幾個問題。Python:將列添加到熊貓數據框並遍歷其中一列
我是熊貓新手,對我這麼光禿禿的。我已經加載了一個包含多個列的數據框,其中一個包含一個地址。我正在使用python geocoder模塊爲本csv中的每個地址獲取緯度/經度。
熊貓
1)如何添加新列?我應該在列中添加列,還是應該在開始時添加列?
2)在我的代碼下面,我試圖遍歷數據框中的每一行。對於每一行,我正在執行geocoder.google()方法。我的CSV /數據幀的第16列包含一個地址。
如何在遍歷所有行時引用該地址列?如果我按原樣運行代碼,則會得到「IndexError:元組索引超出範圍」。
CSV
3)我的代碼的第二部分做了類似的事情與CSV模塊。我讀取一個CSV,循環遍歷每一行,並執行前面所述的地理編碼器方法。地理編碼器方法返回2個值的列表(2個座標 - [XXXX,XXXX])。我正在嘗試寫入原始行,然後再寫入兩列以及後面的兩個座標。我得到「類型錯誤:只能串聯列表(不是‘浮動’),列出」
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)
順便說一句,我使用time.sleep(2)由於地理編碼有限制的請求數量。我不在這裏運行代碼,只是把它放在這裏來顯示它。
如果有人有更好的方式使用Python對英國地址進行地理編碼,請告訴我。
編輯:
對於奇拉格 - 我做了你所提到的變化。我試過在下面的代碼中用列索引(它是16)替換'Address'並得到相同的結果。
我添加的列標題與X.columns
現在我就在一個很長的錯誤信息鏈接多個不同的文件。
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)
就CSV而言 - 有17個專欄,我把它們標題放在上面。 '地址'欄是我想要通過地理編碼器的那一欄。地址欄本身是「PAON」,「SAON」,「街道」,「地點」,「縣」&'郵政編碼'的串聯。我也可以包含'City',但是我使用CSV模塊進行的所有級聯。
如果有幫助 - 這裏是地理編碼鏈接:
http://geocoder.readthedocs.io/
編輯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)
每當我做上面運行這段代碼,我得到這個。我只是以最後兩個爲例。這是什麼意思?我將如何通過每一行iterrate,地理編碼地址和等待2秒鐘,我不超過限速?:
(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)
這似乎是它的工作,但收到的一個長長的清單錯誤如: – christaylor
ValueError:一個Series的真值不明確。使用a.empty,a.bool(),a.item(),a.any()或a.all()。 – christaylor
這非常有趣。我不知道你爲什麼會得到這些錯誤,因爲我們並不試圖評估一個系列的真實性。但是,你能告訴我你是如何構建你的輸入CSV文件嗎?我可以嘗試在本地運行它。 – Chirag