我如何使用Pandas专栏来解析来自网络的文本?

km0tfn4u  于 2022-12-10  发布在  其他
关注(0)|答案(2)|浏览(135)

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

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)

虽然它可以在结果页上只有一个属性的情况下工作,但无法为多个属性创建元组。
我想做的是遍历一系列页面,然后将这些内容添加到 Dataframe 中。我知道Pandas可以将嵌套的字典转换为 Dataframe ,但很难让它工作。我试着使用How to make a nested dictionary and dynamically append data的答案,但我迷路了。

fdx2calv

fdx2calv1#

目前,你的函数只返回address中的第一个place(通常在python中,你会使用yield(而不是return)来作为生成器检索所有结果。
当随后执行apply/map时,您通常希望函数返回一个Series...
不过,我想你只是想返回下面的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)
polhcujo

polhcujo2#

为了使代码正常工作,我最终修改了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数据结构的工作原理有了更多的了解。

相关问题