【问题标题】:How can I read a CSV, add two more columns, and insert data that is dependent on the current columns?如何读取 CSV、再添加两列并插入依赖于当前列的数据?
【发布时间】:2021-12-28 15:12:11
【问题描述】:

我有一个看起来像这样但更长的 csv:

ID Address
32 54298 Boca Chica Blvd Brownsville, TX
31 6640 Washington St, Yountville, CA 94599

我正在尝试遍历 csv,使用 geopy 获取每个地址的纬度和经度,然后将它们插入到如下所示的第 3 列和第 4 列中:

ID Address Latitude Longitude
32 54298 Boca Chica Blvd Brownsville, TX 34.5165131 90.1656516
31 6640 Washington St, Yountville, CA 94599 26.1231 51.516125

它是在同一个旧的 csv 中(这就是我正在尝试的),还是在一个新的 csv 中并不重要。我读过的以前的帖子要么侧重于附加整行而不是列,要么只是使用手动输入/硬编码到 python 脚本中的数据填充新列。

到目前为止,我能够遍历并获得纬度和经度。我遇到的问题主要是在写作部分。这是我所拥有的。

import geopy
import pandas as pd
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="sample app")
df = pd.read_csv(r"C:\Users\Desktop\LatLongTest.csv")
for row in df.itertuples():
    try:
        data = geolocator.geocode(row[7])
        print(data.point.latitude)
    except AttributeError:
        print('error')

任何帮助将不胜感激!我当时只有一点 Java 经验。 Python 的文档和已发布的示例对我来说不像 Java 那样直观,所以入门有点挑战。

【问题讨论】:

    标签: python python-3.x pandas csv geopy


    【解决方案1】:

    您只需要添加列然后保存df 数据框。另见Adding new column to existing DataFrame in Python pandas

    你可以试试这样的:

    import geopy
    import pandas as pd
    from geopy.geocoders import Nominatim
    geolocator = Nominatim(user_agent="sample app")
    
    df = pd.read_csv(r"C:\Users\Desktop\LatLongTest.csv")
    
    # add new columns
    df['Longitude'] = 0
    df['Latitude'] = 0
    
    # process all rows
    for row in df.itertuples():
        try:
            data = geolocator.geocode(row[7])
            df.at[row.Index, 'Longitude'] = data.point.longitude
            df.at[row.Index, 'Latitude'] = data.point.latitude
        except AttributeError:
            print('error')
    
    # write to output
    df.to_csv(r"C:\Users\Desktop\LatLongTest_2.csv", sep=";", index=False)
    

    【讨论】:

    • 已接受答案。谢谢!以正确的方式创建“经度”和“纬度”列并使用 df.at[x,y] 分配值是缺失的部分。不幸的是,看起来我已经尽可能多地使用了这个免费的 API,所以我必须开始使用一个花钱的 API。 C'est la vie。
    【解决方案2】:

    使用我将展示的这种方法,您需要创建两个列表,一个带有纬度,另一个带有经度,然后作为列附加到您的 DataFrame。 让我提醒您,它们的行数必须相同,否则会出错。

    import pandas as pd
    
    df = pd.read_csv(r"C:\Users\Desktop\LatLongTest.csv")
    add_to_df = {'Latitude': LatitudeList, 'Longitude': LongitudeList}
    df = df.append(pd.DataFrame(add_to_df))
    df
    

    也可以这样,给每一行加一个值:

    import pandas as pd
    
    df = pd.read_csv(r"C:\Users\Desktop\LatLongTest.csv")
    df.loc[df.Adress == '54298 Boca Chica Blvd Brownsville, TX', "Latitude"] = Latitude
    df.loc[df.Adress == '54298 Boca Chica Blvd Brownsville, TX', "Longitude"] = Longitude
    df
    

    您可以在this link查看更多资源

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多