2017-06-27 106 views
1

我在這裏有幾個問題。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) 

回答

0

您可以在類似於你將如何使用關聯一個大熊貓據幀創建新列數組或字典。您可以爲您的緯度和經度兩個新列,像這樣:

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

然後,你可以寫整個數據幀到CSV:

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

這似乎是它的工作,但收到的一個長長的清單錯誤如: – christaylor

+0

ValueError:一個Series的真值不明確。使用a.empty,a.bool(),a.item(),a.any()或a.all()。 – christaylor

+0

這非常有趣。我不知道你爲什麼會得到這些錯誤,因爲我們並不試圖評估一個系列的真實性。但是,你能告訴我你是如何構建你的輸入CSV文件嗎?我可以嘗試在本地運行它。 – Chirag

相關問題