首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataFrame函数调用对所有行返回相同的结果

DataFrame函数调用对所有行返回相同的结果
EN

Stack Overflow用户
提问于 2020-02-10 09:00:21
回答 2查看 326关注 0票数 0

我有一个包含以下列的DataFrame:

代码语言:javascript
复制
link    sqft    rent    bedroom     address1    address2    address3    bathroom

我有一个函数,它以3个地址作为输入,然后将纬度和经度作为dict返回。

当我像这样应用这个函数时..。

代码语言:javascript
复制
df['lat'] = return_coordinates(df.address1,df.address2,df.addresse3).get('Latitude')

..。lat列包含相同的值。

以下是功能:

代码语言:javascript
复制
import herepy

geocoderApi = herepy.GeocoderApi('ap_key')
def return_coordinates(address1,address2,address3):
    response = geocoderApi.free_form('{},{},{}'.format(address1,address2,address3))
    geocode = response.as_dict()
    geocode = geocode.get('Response')
    geocode = geocode.get('View')
    value =  (geocode[0].get('Result')[0].get('Location').get('DisplayPosition'))
    return value
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-10 12:17:37

下面是一个使用DataFrame.apply()函数的解决方案。文件可以在这里找到。

由于缺乏数据和API访问权限,我伪造了您的数据集( dataset ),尽管效果很差。但这说明了如何使用apply()函数从函数的返回值填充lat列。

基本设置(黑客攻击):

代码语言:javascript
复制
import pandas as pd

data = {'link': ['www.abc.com/1', 'www.abc.com/2', 'www.abc.com/3'],
        'sqft': [1111, 2222, 3333],
        'rent': ['$1111', '$2222', '$3333'],
        'bedroom': [1, 2, 3],
        'address1': [[34.052235, -118.243683], [33.052235, -117.243683], [32.052235, -115.243683]],
        'address2': [[32.715736, -117.161087], [31.715736, -116.161087], [30.715736, -115.161087]],
        'address3': [[33.541679, -117.777214], [32.541679, -116.777214], [31.541679, -115.777214]],
        'bathroom': [1, 2, 3]}

# Create dataset
df = pd.DataFrame(data)

def return_coordinates(address1, address2, address3):
    """Return the first value of the ``address1`` parameter."""
    return address1[0]

使用apply函数:

这将广播return_coordinates函数返回到DataFrame的lat列。

代码语言:javascript
复制
df['lat'] = df.apply(lambda x: return_coordinates(x['address1'], x['address2'], x['address3']), axis=1)

原始数据集:

代码语言:javascript
复制
    address1    address2    address3    bathroom    bedroom     link    rent    sqft
0   [34.052235, -118.243683]    [32.715736, -117.161087]    [33.541679, -117.777214]    1   1   www.abc.com/1   $1111   1111
1   [33.052235, -117.243683]    [31.715736, -116.161087]    [32.541679, -116.777214]    2   2   www.abc.com/2   $2222   2222
2   [32.052235, -115.243683]    [30.715736, -115.161087]    [31.541679, -115.777214]    3   3   www.abc.com/3   $3333   3333

使用新的lat列:

代码语言:javascript
复制
address1    ...     lat
0   [34.052235, -118.243683]    ...     34.052235
1   [33.052235, -117.243683]    ...     33.052235
2   [32.052235, -115.243683]    ...     32.052235

正如您在结果中看到的那样,apply函数为每一行返回address1字段的第一个值。

票数 1
EN

Stack Overflow用户

发布于 2020-02-10 09:22:33

你的代码应该能用。以下是您正在寻找的东西的示例,以防万一:

代码语言:javascript
复制
df = pd.DataFrame({'address1': [1, 2, 3], 'address2': [4, 5, 6], 'address3': [7, 8, 9]})

def return_coordinates(a,b,c):
    d = {
        "Latitude": a+b+c,
        "Longitude": a*b*c
    }
    return d

df['lat'] = return_coordinates(df['address1'], df['address2'], df['address3']).get("Latitude")
df['lng'] = return_coordinates(df['address1'], df['address2'], df['address3']).get("Longitude")
print(df)

产出:

代码语言:javascript
复制
   address1  address2  address3  lat  lng
0         1         4         7   12   28
1         2         5         8   15   80
2         3         6         9   18  162
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60147008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档