Python 如何为多列应用函数?

Python 如何为多列应用函数?,python,pandas,apply,Python,Pandas,Apply,我需要计算熊猫数据帧中两个邮政编码之间的距离 我正在使用pgeocode库计算2个英国邮政编码之间的距离 dist=samp.apply(lambda x:dist.query\u邮政编码(x['a'],x['b']),axis=1)- 它不起作用(未正确调用DataFrame构造函数!)错误您需要参考数据库中的列名,以访问underyling值 换成 dist=samp.apply(lambda x:dist.query\u邮政编码(x['Postcode.x'],x['Postcode.y

我需要计算熊猫数据帧中两个邮政编码之间的距离

我正在使用pgeocode库计算2个英国邮政编码之间的距离

dist=samp.apply(lambda x:dist.query\u邮政编码(x['a'],x['b']),axis=1)
-


它不起作用(未正确调用DataFrame构造函数!)错误

您需要参考数据库中的
列名
,以访问underyling值

换成

dist=samp.apply(lambda x:dist.query\u邮政编码(x['Postcode.x'],x['Postcode.y']),axis=1)

一切都在你的准备中

  • 从webservice获取地理数据
  • 将其准备为元组并生成组合
  • 计算距离
姓名地址1 邮政编码_addr1 地址1 姓名地址2 邮政编码_addr2 地理地址2 英里 1. 宽街牙科手术 HR4 9AR (-2.717611, 52.055269) 金顿外科 HR5 3EA (-3.022556, 52.199361) 23.1971 2. 宽街牙科手术 HR4 9AR (-2.717611, 52.055269) 奥尔顿街外科 HR9 5AB (-2.582971, 51.911934) 13.5525 3. 金顿外科 HR5 3EA (-3.022556, 52.199361) 宽街牙科手术 HR4 9AR (-2.717611, 52.055269) 23.1971 5. 金顿外科 HR5 3EA (-3.022556, 52.199361) 奥尔顿街外科 HR9 5AB (-2.582971, 51.911934) 36.1468 6. 奥尔顿街外科 HR9 5AB (-2.582971, 51.911934) 宽街牙科手术 HR4 9AR (-2.717611, 52.055269) 13.5525 7. 奥尔顿街外科 HR9 5AB (-2.582971, 51.911934) 金顿外科 HR5 3EA (-3.022556, 52.199361) 36.1468
很好,正是我需要的。谢谢你,罗布
import geopy.distance, requests
import pandas as pd

# a few post codes..
df = pd.DataFrame({'Name': ['BROAD STREET DENTAL SURGERY',
  'KINGTON SURGERY',
  'ALTON STREET SURGERY'],
 'PostCode': ['HR4 9AR', 'HR5 3EA', 'HR9 5AB']})


# get geo data for postcodes
dfgeo = (pd.json_normalize(requests.post("http://api.postcodes.io/postcodes", 
               json={"postcodes":df.PostCode.unique().tolist()}).json()["result"])
         # make long / lat a tuple
         .assign(geo=lambda d: d.loc[:,["result.longitude","result.latitude"]].apply(lambda r: tuple(r), axis=1))
         .loc[:,["result.postcode","geo"]]
         .rename(columns={"result.postcode":"PostCode"})
        )

# merge geo data with original postcode data
df = df.merge(dfgeo, on="PostCode")

# generate all combinations, remove to self...
dfd = (df.assign(foo=1).merge(df.assign(foo=1), on="foo", suffixes=("_addr1","_addr2"))
 .drop(columns=["foo"]).loc[lambda d: d.PostCode_addr1!=d.PostCode_addr2]
 # all prep done,  let's calc distance
 .assign(miles=lambda d: d.apply(lambda r: geopy.distance.distance(r["geo_addr1"], r["geo_addr2"]).miles, axis=1))
)