【发布时间】:2016-10-23 20:59:59
【问题描述】:
我正在从网站上抓取选举数据并尝试将其存储在数据框中
import pandas as pd
import bs4
import requests
columns = ['Candidate','Party','Criminal Cases','Education','Age','Total Assets','Liabilities']
df = pd.DataFrame(columns = columns)
ind=1
url = requests.get("http://myneta.info/up2007/index.php?action=show_candidates&constituency_id=341")
soup = bs4.BeautifulSoup(url.content)
for content in soup.findAll("td")[16:]:
df.iloc[ind//7,ind%7-1] = content.text
ind=ind+1
print(df)
基本上,content.text 的每次迭代都会为我提供一个值,我将在表格中填充该值。循环将按以下顺序将值填充到 df -
df[0,0]
df[0,1]
df[0,2]
.
.
.
df[1,0]
df[1,1]
.
.
等等。不幸的是,iloc 抛出了一个错误——“单个位置索引器越界”。有趣的是,当我在 for 循环之外尝试 df.iloc[0,0] = content.text 时(在一个单独的单元格中用于测试目的),代码可以正常工作,但在 for 循环中它会产生错误。我相信这可能是微不足道的,但我无法理解。请帮助
【问题讨论】:
-
在询问为什么一段代码不工作时包括回溯(如果有的话)。
ind%7-1将为 7 生成-1,这可能会让你失望。另外,您的示例是否完整?DataFrame.iloc甚至不应该能够附加数据(或者我在你的例子中遗漏了一些东西)。 -
@IljaEverilä 我同意,但这将在 for 循环运行 6 次后发生。问题是它甚至没有运行一次。我有一个处理'ind = 7'的逻辑,但要达到那个逻辑,'ind = 1,2 ...'需要先运行
-
问题仍然存在,使用
iloc您不应该能够附加到DataFrame。您的df最初为空。 -
让我更简单地解释一下。问题最终归结为这类问题 - ' df1 = pd.DataFrame(columns= ['a','b','c']) df1.iloc[0,0]=1 - # 不起作用 输出- 单个位置索引器超出范围 df1.loc[0,'a']=1 - # Works print(df1) 输出 abc 0 1 NaN NaN'
-
你用的是什么版本的熊猫?
标签: python indexing dataframe web-scraping