拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 连接多个具有相同列名的CSV

连接多个具有相同列名的CSV

白鹭 - 2022-02-10 2094 0 0

我在连接这些 Pandas 资料帧时遇到了麻烦,因为我不断收到错误讯息,说pandas.errors.InvalidIndexError: Reindexing only valid with uniquely valued Index objects我也在尝试让我的代码不那么笨拙并运行更流畅。我还想知道是否有办法使用 python 在一个 csv 上获取多个页面。任何帮助都会很棒。

import requests
from bs4 import BeautifulSoup
import pandas as pd

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}

URL = "https://www.collincad.org/propertysearch?situs_street=Willowgate&situs_street_suffix" \
      "=&isd[]=any&city[]=any&prop_type[]=R&prop_type[]=P&prop_type[]=MH&active[]=1&year=2021&sort=G&page_number=1"

t = URL   "&page_number="
URL2 = t   "2"
URL3 = t   "3"

s = requests.Session()

data = []

page = s.get(URL,headers=headers)
page2 = s.get(URL2, headers=headers)
page3 = s.get(URL3, headers=headers)

soup = BeautifulSoup(page.content, "lxml")
soup2 = BeautifulSoup(page2.content, "lxml")
soup3 = BeautifulSoup(page3.content, "lxml")


for row in soup.select('#propertysearchresults tr'):
    data.append([c.get_text(' ',strip=True) for c in row.select('td')])
for row in soup2.select('#propertysearchresults tr'):
    data.append([c.get_text(' ',strip=True) for c in row.select('td')])
for row in soup3.select('#propertysearchresults tr'):
    data.append([c.get_text(' ',strip=True) for c in row.select('td')])


df1 = pd.DataFrame(data[1:], columns=data[0])
df2 = pd.DataFrame(data[2:], columns=data[1])
df3 = pd.DataFrame(data[3:], columns=data[2])

final = pd.concat([df1, df2, df3], axis=0)

final.to_csv('Street.csv', encoding='utf-8')

uj5u.com热心网友回复:

怎么了?

如前所述@Zach Youngdata已经保存了您想转换为一个资料帧的所有行所以这不是一个问题,pandas更多的是如何收集信息的问题。

怎么修?

基于您问题中的代码的一种方法是选择更具体的表资料 - 请注意tbody选择中的,这将排除标题:

for row in soup.select('#propertysearchresults tbody tr'):
    data.append([c.get_text(' ',strip=True) for c in row.select('td')])

在创建资料框时,您可以另外设定列标题:

pd.DataFrame(data, columns=[c.get_text(' ',strip=True) for c in soup.select('#propertysearchresults thead td')])

例子

这将展示如何迭代包含您的表格的网站的不同页面:

import requests
from bs4 import BeautifulSoup
import pandas as pd

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}

URL = "https://www.collincad.org/propertysearch?situs_street=Willowgate&situs_street_suffix" \
      "=&isd[]=any&city[]=any&prop_type[]=R&prop_type[]=P&prop_type[]=MH&active[]=1&year=2021&sort=G&page_number=1"

s = requests.Session()

data = []
while True:

    page = s.get(URL,headers=headers)
    soup = BeautifulSoup(page.content, "lxml")

    for row in soup.select('#propertysearchresults tbody tr'):
        data.append([c.get_text(' ',strip=True) for c in row.select('td')])

    if (a := soup.select_one('#page_selector strong   a')):
        URL = "https://www.collincad.org" a['href']
    else:
        break


pd.DataFrame(data, columns=[c.get_text(' ',strip=True) for c in soup.select('#propertysearchresults thead td')])

输出

物业编号 ↓ 地理编号 ↓ 业主姓名 物业地址 法律说明 2021年市场价值
1 2709013 R-10644-00H-0010-1 PARTHASARATHY SURESH & ANITHA HARIKRISHNAN 12209 Willowgate Dr Frisco, TX 75035 Panther Creek Phase 2, Blk H, Lot 1 的 Ridgeview 513,019 美元
... ... ... ... ... ...
61 2129238 R-4734-00C-0110-1 赫弗·阿伦 990 Willowgate Dr Prosper, TX 75078 Willow Ridge 第一期,Blk C,Lot 11 509,795 美元

uj5u.com热心网友回复:

通常一个人会遍历页码并连接一个资料框串列,但如果你只有三页,你的代码就可以了。

因为for row in ...总是写入data,你的最终资料帧是 df1,但你只需要洗掉列命名的行。

final = df1[df1['Property ID ↓ Geographic ID ↓']!='Property ID ↓ Geographic ID ↓']

uj5u.com热心网友回复:

而不是你的最后几行代码:

df1 = pd.DataFrame(data[1:], columns=data[0])
df2 = pd.DataFrame(data[2:], columns=data[1])
df3 = pd.DataFrame(data[3:], columns=data[2])

final = pd.concat([df1, df2, df3], axis=0)

final.to_csv('Street.csv', encoding='utf-8')

您可以使用它(避免切片到不同的资料帧和串联):

final = pd.DataFrame(data[1:], columns=data[0])   # Sets the first row as the column names
final = final.iloc[:,1:]   # Gets rid of the additional index column
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *