簡體   English   中英

向pandas數據框添加列並遍歷其中一列

[英]Adding Columns to pandas dataframe & iterating through one of the columns

我已在具有多個列的數據框中加載了數據,其中一個包含地址。 我正在使用python地理編碼器模塊來獲取此csv中每個地址的經/緯度。

熊貓

1)如何添加新列? 我應該在遍歷行時添加列,還是應該在開始時添加列?

2)在下面的代碼中,我試圖遍歷數據幀中的每一行。 對於每一行,我都在執行geocoder.google()方法。 我的csv /數據框的第16列包含一個地址。

在遍歷所有行時如何引用該地址列? 如果按原樣運行代碼,則會收到“ IndexError:元組索引超出范圍”。

CSV

3)我的代碼的第二部分在CSV模塊中做了類似的事情。 我讀了一個CSV文件,遍歷每一行並執行地理編碼器方法,如前所述。 地理編碼器方法返回2個值的列表(2個坐標-[XXXX,XXXX])。 我試圖寫原始行,然后再寫兩個列,然后再寫兩個坐標。 我收到“ TypeError:只能將列表(而不是“浮動”)連接到列表”

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對英國地址進行地理編碼,請告訴我。


編輯:

對於Chirag-我已經進行了您提到的更改。 我試圖用相同的結果將下面代碼中的“地址”替換為列索引(即16)。

我用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”,“ Street”,“ Locality”,“ County”和“ Postcode”的串聯。 我本來也可以包含“城市”,但是我使用CSV模塊所做的所有串聯。

如果有幫助-這是Geocoder鏈接:

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)

每當我在上面運行此代碼時,我都會得到。 我只是以最后兩個為例。 這是什么意思? 我將如何遍歷每一行,對地址進行地址解析並等待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)

您可以在pandas數據框中創建新列,類似於使用關聯數組或字典的方式。 您可以像這樣為緯度和經度創建兩個新列:

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

然后,您可以將整個數據幀寫入csv:

df.to_csv('RSM_GCTest.csv')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM