将列添加到 pandas 数据框并遍历其中一列
Adding Columns to pandas dataframe & iterating through one of the columns
我加载了一个包含多列的数据框,其中一列包含一个地址。我正在使用 python 地理编码器模块为这个 csv 中的每个地址获取 lat/long。
Pandas
1) 如何添加新列?我应该在遍历行时添加列,还是应该在开始时添加列?
2) 在我下面的代码中,我试图遍历数据框中的每一行。对于每一行,我都在执行 geocoder.google() 方法。我的 csv/data 框架的第 16 列包含一个地址。
在遍历所有行时如何引用该地址列?如果我按原样 运行 代码,我会得到 "IndexError: tuple index out of range"。
CSV
3) 我的代码的第二部分对 CSV 模块做了类似的事情。我读入了一个 CSV 文件,遍历每一行并执行之前所说的地理编码器方法。地理编码器方法 returns 2 个值的列表(2 个坐标 - [XXXX,XXXX])。我正在尝试写入原始行,然后再写入两个坐标中的每一个的两列。我正在 "TypeError: can only concatenate list (not "float") 列出"
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)替换下面代码中的 'Address',结果相同。
我添加了列 headers 和 X.columns
我现在收到一条很长的错误消息 link 处理许多不同的文件。
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 列,我已将它们命名为上面。 'Address' 列是我要通过地理编码器传递的列。地址列本身是 'PAON'、'SAON'、'Street'、'Locality'、'County' 和 'Postcode' 的串联。我也可以包含 'City',但我使用 CSV 模块进行的所有连接。
如果有帮助 - 这是地理编码器 link:
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')
我加载了一个包含多列的数据框,其中一列包含一个地址。我正在使用 python 地理编码器模块为这个 csv 中的每个地址获取 lat/long。
Pandas
1) 如何添加新列?我应该在遍历行时添加列,还是应该在开始时添加列?
2) 在我下面的代码中,我试图遍历数据框中的每一行。对于每一行,我都在执行 geocoder.google() 方法。我的 csv/data 框架的第 16 列包含一个地址。
在遍历所有行时如何引用该地址列?如果我按原样 运行 代码,我会得到 "IndexError: tuple index out of range"。
CSV
3) 我的代码的第二部分对 CSV 模块做了类似的事情。我读入了一个 CSV 文件,遍历每一行并执行之前所说的地理编码器方法。地理编码器方法 returns 2 个值的列表(2 个坐标 - [XXXX,XXXX])。我正在尝试写入原始行,然后再写入两个坐标中的每一个的两列。我正在 "TypeError: can only concatenate list (not "float") 列出"
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)替换下面代码中的 'Address',结果相同。
我添加了列 headers 和 X.columns
我现在收到一条很长的错误消息 link 处理许多不同的文件。
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 列,我已将它们命名为上面。 'Address' 列是我要通过地理编码器传递的列。地址列本身是 'PAON'、'SAON'、'Street'、'Locality'、'County' 和 'Postcode' 的串联。我也可以包含 'City',但我使用 CSV 模块进行的所有连接。
如果有帮助 - 这是地理编码器 link:
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')