Python 如何将此列表转换为数据帧?

Python 如何将此列表转换为数据帧?,python,pandas,list,dataframe,Python,Pandas,List,Dataframe,我在网页中循环,获取表中的行,然后将每一行附加到数据框中。然而,我得到了一个不能连接到一个数据帧中的列表。如何将此列表转换为允许pd.concat() 我已经尝试了pd.DataFrame(data),但返回的是KeyError:0 以下是打印结果(数据): ID是: UnitID 180203 177834 222178 138558 412173 126182 188429 188438 168528 133872 理想情况下,我希望输出有一个id列,每个年度范围(2015-2016、20

我在网页中循环,获取表中的行,然后将每一行附加到数据框中。然而,我得到了一个不能连接到一个数据帧中的列表。如何将此列表转换为允许pd.concat()

我已经尝试了
pd.DataFrame(data)
,但返回的是KeyError:0

以下是打印结果(数据):

ID是:

UnitID
180203
177834
222178
138558
412173
126182
188429
188438
168528
133872
理想情况下,我希望输出有一个id列,每个年度范围(2015-2016、2016-2017等)的列,在矩阵中填入净价,如下所示:

很酷的问题

因此,当您使用熊猫做任何事情时,它通常会给您一个系列或数据帧作为输出。因此,当您创建一个名为
data
的列表,然后将
表[0]
附加到该列表中时。(我想)你以为你在给它添加一个列表。但是
pd.read\u html
给出了一个数据帧。因此,您只需要将
数据创建为一个数据帧,然后将每个数据帧附加到它

以下是解决方案:

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

data = pd.DataFrame()
url = 'https://nces.ed.gov/collegenavigator/?id='
ids = pd.read_excel('ids.xlsx')
for index, row in ids.iterrows():
    try:
        r = requests.get(url+str(row[0]))
        soup = bs(r.content, 'lxml')
        table = pd.read_html(str(soup.select_one('table:has(td:contains("Average net price"))')))
        data = data.append(table[0], ignore_index=True)
    except:
        pass
希望有帮助

很酷的问题

因此,当您使用熊猫做任何事情时,它通常会给您一个系列或数据帧作为输出。因此,当您创建一个名为
data
的列表,然后将
表[0]
附加到该列表中时。(我想)你以为你在给它添加一个列表。但是
pd.read\u html
给出了一个数据帧。因此,您只需要将
数据创建为一个数据帧,然后将每个数据帧附加到它

以下是解决方案:

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

data = pd.DataFrame()
url = 'https://nces.ed.gov/collegenavigator/?id='
ids = pd.read_excel('ids.xlsx')
for index, row in ids.iterrows():
    try:
        r = requests.get(url+str(row[0]))
        soup = bs(r.content, 'lxml')
        table = pd.read_html(str(soup.select_one('table:has(td:contains("Average net price"))')))
        data = data.append(table[0], ignore_index=True)
    except:
        pass
希望有帮助

使用:

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

data = []
url = 'https://nces.ed.gov/collegenavigator/?id='
ids = pd.read_excel('ids.xlsx')

for index, row in ids.iterrows():

    try:
        r = requests.get(url+str(row[0]))
        soup = bs(r.content, 'lxml')
        table = pd.read_html(str(soup.select_one('table:has(td:contains("Average net price"))')))
        dataframe=table[0]
        dataframe.index=row
        data.append(dataframe)
    except:
        pass


df_values= (pd.concat(data,sort=False)
              .drop('Unnamed: 0',axis=1)
              .rename_axis(index='UnitID') )
print(df_values)

输出:

        2015-2016 2016-2017 2017-2018
UnitID                              
180203    $6,497    $8,311    $7,035
222178   $26,916   $27,175   $27,584
138558    $8,123    $8,022    $7,687
412173         —   $16,694   $21,842
126182   $13,888   $12,989   $13,314
188429   $28,095   $27,925   $28,406
188438    $7,242    $6,960    $8,436
168528   $25,839   $26,930   $26,710
133872   $18,603   $16,450   $17,145
使用:


输出:

        2015-2016 2016-2017 2017-2018
UnitID                              
180203    $6,497    $8,311    $7,035
222178   $26,916   $27,175   $27,584
138558    $8,123    $8,022    $7,687
412173         —   $16,694   $21,842
126182   $13,888   $12,989   $13,314
188429   $28,095   $27,925   $28,406
188438    $7,242    $6,960    $8,436
168528   $25,839   $26,930   $26,710
133872   $18,603   $16,450   $17,145

基本上,只需将id保存在单独的已解析数据帧列中。现在它被忽略了

...
for index, row in ids.iterrows(): 
    try: 
        r = requests.get(url+str(row[0])) 
        soup = bs(r.content, 'lxml') 
        table = pd.read_html(str(soup.select_one('table:has(td:contains("Average net price"))')), index_col=0)[0] 
        table['id'] = row[0] # save the Id in a separate column
        data.append(table.set_index('id'))
    except: 
        pass

df = pd.concat(data)
结果:

       2015-2016 2016-2017 2017-2018
id                                  
180203    $6,497    $8,311    $7,035
222178   $26,916   $27,175   $27,584
138558    $8,123    $8,022    $7,687
412173         —   $16,694   $21,842
126182   $13,888   $12,989   $13,314
188429   $28,095   $27,925   $28,406
188438    $7,242    $6,960    $8,436
168528   $25,839   $26,930   $26,710
133872   $18,603   $16,450   $17,145

基本上,只需将id保存在单独的已解析数据帧列中。现在它被忽略了

...
for index, row in ids.iterrows(): 
    try: 
        r = requests.get(url+str(row[0])) 
        soup = bs(r.content, 'lxml') 
        table = pd.read_html(str(soup.select_one('table:has(td:contains("Average net price"))')), index_col=0)[0] 
        table['id'] = row[0] # save the Id in a separate column
        data.append(table.set_index('id'))
    except: 
        pass

df = pd.concat(data)
结果:

       2015-2016 2016-2017 2017-2018
id                                  
180203    $6,497    $8,311    $7,035
222178   $26,916   $27,175   $27,584
138558    $8,123    $8,022    $7,687
412173         —   $16,694   $21,842
126182   $13,888   $12,989   $13,314
188429   $28,095   $27,925   $28,406
188438    $7,242    $6,960    $8,436
168528   $25,839   $26,930   $26,710
133872   $18,603   $16,450   $17,145

请提供基于此输入的示例输出,并编辑您的输入以反映有效的python列表。你提供的不是有效的python。更新了我的帖子。我猜我的问题的根源是当我循环并附加每一行作为列表时,在以后尝试转换为dataframe时必须使其不稳定?请提供基于此输入的示例输出,并编辑您的输入以反映有效的python列表。你提供的不是有效的python。更新了我的帖子。我猜我的问题的根源是当我循环并附加每一行作为列表时,在以后尝试转换为dataframe时必须使其不稳定?谢谢你的解释:)谢谢你的解释:)