【问题标题】:What is the correct way to use .apply with pandas?将 .apply 与熊猫一起使用的正确方法是什么?
【发布时间】:2016-12-12 11:43:15
【问题描述】:

我正在使用包含“纬度”和“经度”列的百万行 CSV 数据集,并且我想根据称为“州”的列创建一个新列,该列是包含这些坐标的美国州.

import pandas as pd
import numpy as np
import os
from uszipcode import ZipcodeSearchEngine

def convert_to_state(coord):
    lat, lon = coord["latitude"], coord["longitude"]
    res = search.by_coordinate(lat, lon, radius=1, returns=1)
    state = res.State
    return state

def get_state(path):
    with open(path + "USA_downloads.csv", 'r+') as f:
        data = pd.read_csv(f)
        data["state"] = data.loc[:, ["latitude", "longitude"]].apply(convert_to_state, axis=1)

get_state(path)

我不断收到错误消息“DtypeWarning:列 (4,5) 具有混合类型。在导入时指定 dtype 选项或设置 low_memory=False。”第 4 列和第 5 列对应于纬度和经度。我不明白我将如何使用 .apply 来完成这项任务,或者 .apply 是否是完成这项工作的正确方法。我应该如何进行?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我相信这会更快地实现您的程序:

    import pandas as pd
    import numpy as np
    import os
    from uszipcode import ZipcodeSearchEngine
    
    def convert_to_state(lat, lon):
        lat, lon = round(lat, 7), round(lon, 7)
        res = search.by_coordinate(lat, lon, radius=1, returns=1)
        state = res.State
        return state
    
    def get_state(path):
        with open(path + "USA_downloads.csv", 'r+') as f:
            data = pd.read_csv(f)
            data["state"] = np.vectorize(convert_to_state)(data["latitude"].values, data["longitude"].values)
    
    get_state(path)
    

    它使用numpy.vectorize 来加快速度(尽管它仍然是一个循环),然后使用从DataFrame 的'latitude' 和'longitude' 列获得的值调用函数,转换为@987654325 @(.values 属性就是这样做的)。


    如果你想继续使用.apply(),你可以这样做:

    state = data.apply(lambda x: convert_to_state(x['latitude'], x['longitude']), axis=1)
    data["state"] = state
    

    编辑

    要避免uszipcode 引发TypeError,请使用以下命令:

    def convert_to_state(lat, lon):
        try:
            res = search.by_coordinate(lat, lon, radius=1, returns=1)
            state = res.State
        except TypeError as TE:
            state = None
        return state
    

    如果你想进一步调试uszipcode,以及它导致错误的原因,我建议你再问一个问题,用适当的标签,有人会帮助你。我对这个包没有经验,所以我可能帮不上什么忙。

    【讨论】:

    • 你是最棒的。非常感谢您的解释!这太棒了!
    • @user1917407,谢谢!很高兴我能帮上忙。
    • 实际上,您拥有的是dtype warning,在大多数情况下您可以忽略它。对您的get_state 函数进行此更改:data = pd.read_csv(f, low_memory=False),然后编辑您的问题以包含此行的输出:print(df.dtypes)。在try .. except 子句中进一步保护您的res = search.by_coordinate...,并打印引发异常的纬度和经度。我认为解决dtype 冲突也将解决uszipcode 提出的TypeError
    • 问题出在uszipcode。您在这里有两个选择,使用另一个包,或者在我的答案的后半部分进行更改。问题是,如果您进行更改,您的程序将正常运行,但您将没有关于您的某些观点的信息,uszipcode 会引发错误。
    • 另外,查看您的data.dtypes 输出,纬度和经度列的类型为objects。这意味着某些纬度和经度不是严格的数字。您必须深入挖掘数据并找出哪些行没有数字。从长远来看,这也很有用。
    猜你喜欢
    • 2018-04-15
    • 2018-04-10
    • 2013-01-02
    • 1970-01-01
    • 2020-08-27
    • 2020-07-10
    • 2020-09-29
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多