【问题标题】:Adding Columns to pandas dataframe & iterating through one of the columns将列添加到熊猫数据框并遍历其中一列
【发布时间】:2017-06-27 14:50:42
【问题描述】:

我已经加载了一个包含多个列的数据帧,其中一个包含一个地址。我正在使用 python 地理编码器模块来获取此 csv 中每个地址的纬度/经度。

熊猫

1) 如何添加新列?我应该在遍历行时添加列,还是应该在开始时添加列?

2) 在下面的代码中,我试图遍历数据框中的每一行。对于每一行,我都在执行 geocoder.google() 方法。我的 csv/数据框的第 16 列包含一个地址。

在遍历所有行时如何引用该地址列?如果我按原样运行代码,我会得到“IndexError:元组索引超出范围”。

CSV

3) 我的代码的第二部分对 CSV 模块做了类似的事情。我读入 CSV,遍历每一行并执行之前所说的地理编码器方法。 geocoder 方法返回 2 个值的列表(2 个坐标 - [XXXX,XXXX])。我试图写入原始行,然后再写入两个坐标,然后再写入两个坐标。我收到“TypeError:只能将列表(不是“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)。

我用 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 列,我已将它们标在上面。 “地址”列是我要通过地理编码器的列。 Address 列本身是“PAON”、“SAON”、“Street”、“Locality”、“County”和“Postcode”的串联。我也可以包括“城市”,但我使用 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)

每当我在上面运行这段代码时,我都会得到这个。我只是以最后两个为例。这是什么意思?我将如何遍历每一行,对地址进行地理编码并等待 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)

【问题讨论】:

    标签: python google-maps pandas gis geocode


    【解决方案1】:

    您可以在 pandas 数据框中创建新列,类似于使用关联数组或字典的方式。您可以像这样为纬度和经度创建两个新列:

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

    然后您可以将整个数据帧写入 csv:

    df.to_csv('RSM_GCTest.csv')
    

    【讨论】:

    • 这似乎可行,但会收到一长串错误,例如:
    • ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
    • 这很有趣。我不知道您为什么会收到这些错误,因为我们没有尝试评估系列的真实性。但是,您能告诉我您是如何构建输入 csv 文件的吗?我可以尝试在本地运行它。
    • 我会在几个小时内回复。我现在还有一些其他的东西要买
    • 我已在此问题的主要部分添加了回复。
    猜你喜欢
    • 2021-11-09
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2017-06-08
    • 2016-09-08
    相关资源
    最近更新 更多