迭代循环并将列表添加到新行或新列中的数据框
Posted
技术标签:
【中文标题】迭代循环并将列表添加到新行或新列中的数据框【英文标题】:Iterate over loop and adding list to dataframe in new row or new column 【发布时间】:2019-06-09 05:22:25 【问题描述】:我确信这很简单,但我对 Python 还是很陌生。我很难在每次循环迭代后将列表添加到数据框列或行。 我想使用外部 for 循环遍历大约一百个 URL 的列表,并使用内部循环提取数据。每次
现在,我可以使用代码创建一个数据框,将所有列表一起附加到数据框中的一列或一行。但是我希望内部循环的每次迭代都在数据帧的新列或行中单独进行。
list_rows = []
for x in link_href_list:
urllib.request.urlopen(x)
html = urlopen(x)
bs = BeautifulSoup(html, "lxml")
table=bs.find('tbody')
rows = table.tr.next_siblings
for row in rows:
a=row.find('td').get_text().strip()
list_rows.append(a)
list_rows.to_frame()
不幸的是,内部循环的列表会有不同的长度! 也许有人有一个简单的解决方案或提示我可以改变什么?谢谢!
【问题讨论】:
想要的输出是什么? 我希望在数据帧的新列或新行中输出内部循环的每次迭代 【参考方案1】:我假设您的意思是外循环的每次迭代都在一个新的“行”中。 结果,这将创建一个二维数组(列表),对于 link_href_list 中的每个元素,您将获得一个新的“行”。虽然,我不知道 to_frame() 方法是什么,但我认为它是一个打印输出。
list_columns = []
for x in link_href_list:
urllib.request.urlopen(x)
html = urlopen(x)
bs = BeautifulSoup(html, "lxml")
table=bs.find('tbody')
rows = table.tr.next_siblings
list_rows = []
for row in rows:
a=row.find('td').get_text().strip()
list_rows.append(a)
list_columns.append(list_rows)
list_columns.DataFrame()
编辑:如果 to_frame 是 pandas DataFrame 的东西,我不完全确定它将如何处理不同的长度。我会检查一对夫妇,但也有办法解决这个问题。 似乎没有关于如何导入不同长度列表的非常简单的答案,并且找到最长的列表并相应地调整 pandas 导入并在新循环中使列表长度相等。
【讨论】:
谢谢,这很好用。现在我得到一个二维数据框。你是对的,我不得不改变'pd.DataFrame()'中的to_frame 很高兴听到它有帮助。这实际上让我重新开始了我以前的自动音乐创作项目。 :-) 我只会修改源代码以反映有效的方法。您能否用输入内容和响应内容更新问题,以便问题中的数据完整?干杯。【参考方案2】:一种方法是在外面创建一个空列表,然后在循环中追加,你已经尝试过了。您的问题似乎是创建数据框。我本来只是在上面的答案下发表评论以供其他人参考,但是我不能将 cmets 留在这个代表处。
定义列,然后使用 from_records
创建数据框
import pandas as pd
cols = ['col_1','col_2',...,'col_n']
df = pd.DataFrame.from_records(list_cols, columns=cols)
上面的答案会创建一个列表 (list_columns = []
),然后尝试转换为 Dataframe。这应该抛出以下内容:
Traceback (most recent call last):
File "<ipython-input-396-dc539f26ae12>", line 1, in <module>
list_columns.Dataframe()
AttributeError: 'list' object has no attribute 'Dataframe'
【讨论】:
以上是关于迭代循环并将列表添加到新行或新列中的数据框的主要内容,如果未能解决你的问题,请参考以下文章
循环遍历 pandas 数据框列中的列表元素以在新列中返回列表