【问题标题】:AssertionError: 22 columns passed, passed data had 21 columnsAssertionError: 22 列传递,传递的数据有 21 列
【发布时间】:2020-02-06 21:10:26
【问题描述】:

这是我的代码:

from urllib import urlopen
from bs4 import BeautifulSoup
import pandas as pd

url = "http://www.basketball-reference.com/draft/NBA_2014.html"
html = urlopen(url)
soup = BeautifulSoup(html)
column_headers = [th.getText() for th in soup.findAll('tr',limit=2)[1].findAll('th')]
data_rows = soup.findAll('tr')[2:]
player_data = [[td.getText() for td in data_rows[i].findAll('td')] for i in range(len(data_rows))] #PLAYER DATA 

type(soup)
type(data_rows)

df = pd.DataFrame(player_data,columns=column_headers)

错误似乎出现在最后一行。

【问题讨论】:

标签: python pandas


【解决方案1】:

首先,错误非常简单:您的 column_headers 列表有 22 列,但 player_data 条目只有 21。因此您需要找出缺少哪个列以及原因。仅通过直观地比较数据框和标题列表中的条目,似乎缺少前两列中的一列。 player_data[0][0] 返回

1, CLE, Andrew Wiggins, University of Kansas,... 但应该是

1, 1, CLE, Andrew Wiggins, University of Kansas,...

问题在于表本身。导航到网站,将鼠标悬停在表格上并右键单击:inspect。

第一行数据(“Rk”下方)由 21 个td 和 1 个th 元素组成。 “rk”条目实际上是th 类型而不是td

这就是为什么你的

player_data = [[td.getText() for td in data_rows[i].findAll('td')] for i in range(len(data_rows))] 

跳过第一列,因为它只迭代td 元素。因此长度不同。 我不知道第一列有多重要;快速解决方法是从标题列表中删除 Rk 列。

或者,搜索both td and th elements

player_data = [[td.getText() for td in data_rows[i].findAll(['td','th'])] for i in range(len(data_rows))]

【讨论】:

    猜你喜欢
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多