1

我在邮政编码的数据框列上使用了 map 函数来创建一个新的元组系列,然后我可以将其操作到一个新的数据框中。

def scrape_data(series_data):
    #A bit of code to create the URL goes here

    r = requests.get(url)
    root_content = r.content
    root = lxml.html.fromstring(root_content)

    address = root.cssselect(".lr_results ul")
    for place in address:
        address_property = place.cssselect("li a")[0].text
        house_type = place.cssselect("li")[1].text
        house_sell_price = place.cssselect("li")[2].text
        house_sell_date = place.cssselect("li")[3].text
        return address_property, house_type, house_sell_price, house_sell_date

df = postcode_subset['Postcode'].map(scrape_data)

虽然它适用于结果页面上只有一个属性的情况,但它无法为多个属性创建元组。

我想做的是遍历一系列页面,然后将该内容添加到数据框中。我知道 Pandas 可以将嵌套的 dicts 转换为数据帧,但很难让它发挥作用。我尝试使用如何制作嵌套字典并动态附加数据的答案,但我迷路了。

谁能帮我指出正确的方向?

4

2 回答 2

1

目前,您的函数仅返回第一个placein address(通常在 python 中,您会yield(而不是return)将所有结果作为生成器检索。

随后进行应用/映射时,您通常希望该函数返回一个系列...

但是,我认为您只想返回以下 DataFrame:

return pd.DataFrame([{'address_ property': place.cssselect("li a")[0].text,
                      'house_type': place.cssselect("li")[1].text,
                      'house_sell_price': place.cssselect("li")[2].text,
                      'house_sell_date': place.cssselect("li")[3].text}
                          for place in address],
                    index=address)
于 2013-06-05T09:27:35.860 回答
0

为了使代码正常工作,我最终将 Andy Hayden 的解决方案改写为:

listed = []
    for place in address:
        results = [{'postcode':postcode_bit,'address_ property': place.cssselect("li a")[0].text,
                  'house_type': place.cssselect("li")[1].text,
                  'house_sell_price': place.cssselect("li")[2].text,
                  'house_sell_date': place.cssselect("li")[3].text}]

        listed.extend(results)
    return listed

至少我现在对 Python 数据结构的工作原理有了更多的了解。

于 2013-06-06T06:16:00.260 回答