Pandas DF.output 写入列(当前数据全部写入一行或一列)

Posted

技术标签:

【中文标题】Pandas DF.output 写入列(当前数据全部写入一行或一列)【英文标题】:Pandas DF.output write to columns (current data is written all to one row or one column) 【发布时间】:2022-01-04 22:50:39 【问题描述】:

我正在使用 Selenium 从网页的 html 正文中提取数据,并正在使用 pandas 将数据写入 .csv 文件。

数据被提取并写入文件,但是我想操纵数据的格式以写入指定的列,在阅读了许多线程和文档后,我无法理解如何做到这一点。

当前CSV文件输出如下,一行或一列所有数据

0,
B09KBFH6HM,
dropdownAvailable,
90,
1,
B09KBNJ4F1,
dropdownAvailable,
100,
2,
B09KBPFPCL,
dropdownAvailable,
110

或者如果我使用 [count] count +=1 方法,它将是一行

0,B09KBFH6HM,dropdownAvailable,90,1,B09KBNJ4F1,dropdownAvailable,100,2,B09KBPFPCL,dropdownAvailable,110

我希望输出格式如下,

/col1 /col2      /col3             /col4 
0,   B09KBFH6HM, dropdownAvailable, 90, 
1,   B09KBNJ4F1, dropdownAvailable, 100,    
2,   B09KBPFPCL, dropdownAvailable, 110

我尝试使用 columns= 选项,但在终端中出现错误,并且不明白我应该使用什么功能在附加详细信息下的文档中实现此目的

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.append.html?highlight=append#pandas.DataFrame.append

简化版如下

from selenium import webdriver
import pandas as pd

price = []

driver = webdriver.Chrome("./chromedriver")
driver.get("https://www.example.co.jp/dp/zzzzzzzzzz/")


select_box = driver.find_element_by_name("dropdown_selected_size_name")
options = [x for x in select_box.find_elements_by_tag_name("option")]
for element in options:
    price.append(element.get_attribute("value"))
    price.append(element.get_attribute("class"))
    price.append(element.get_attribute("data-a-html-content"))


output = pd.DataFrame(price)
output.to_csv("Data.csv", encoding='utf-8-sig')

driver.close()

我需要单独解析每个项目并附加吗? 我希望将每个 .get_attribute 值写入一个新列。

由于我对熊猫不是很精通,您有什么建议可以解决这个问题,谢谢您的帮助

【问题讨论】:

【参考方案1】:

 类似于 @user17242583 的方法,但更短一些:

data = [[e.get_attribute("value"), e.get_attribute("class"), e.get_attribute("data-a-html-content")] for e in options]

df = pd.DataFrame(data, columns=['ASIN', 'dropdownAvailable', 'size']) # third column maybe is the product size
df.to_csv("Data.csv", encoding='utf-8-sig')

【讨论】:

感谢您对此问题的反馈,尽管由于语法顺序,您的答案是我理解最少的答案(我将做进一步的研究以更多地了解这种风格)这个答案是对我来说效果最好,直接开箱即用,列清晰,并根据需要排序结果。非常感谢您抽出时间来帮助我,非常感谢,我现在可以继续这个项目了。【参考方案2】:

将所有项目添加到price 列表将导致它们全部位于一列中。相反,在字典中为每一列存储单独的列表,如下所示(随意命名):

data = 
    'values': [],
    'classes': [],
    'data_a_html_contents': [],


...

for element in options:
    values.append(element.get_attribute("value"))
    classes.append(element.get_attribute("class"))
    data_a_html_contents.append(element.get_attribute("data-a-html-content"))

...

output = pd.DataFrame(data)
output.to_csv("Data.csv", encoding='utf-8-sig')

【讨论】:

感谢您提供信息丰富的回复,您已确认我将所有内容附加到一个列表的问题,我真的很喜欢使用列表的简单解决方案,并将了解有关此方法的更多信息。虽然我无法实施您的解决方案,虽然我尝试了很多次但我总是收到错误values.append(element.get_attribute("value")) NameError: name 'values' is not defined 我尝试了脚本中的几个变体和位置,但无法让它工作,我真的很遗憾我不能让它工作(由于我自己缺乏知识)谢谢你的回复【参考方案3】:

您正在收集 valueclassdata-a-html-content 并将它们附加到同一个列表中@ 987654327@。因此,列表变为:

price = [value1, class1, data-a-html-content1, value2, class2, data-a-html-content2, ...]

因此,在dataframe 中看起来像:


解决方案

要在单独的列中获取 valueclassdata-a-html-content,您可以采用以下两个 @987654322 中的任何一个@:

将字典传递给数据框。 将列表列表传递给数据框。

虽然 @user17242583 和 @h.devillefletcher 建议使用字典,但您仍然可以使用 list of lists 实现相同的目的,如下所示:

values = []
classes = []
data-a-html-contents = []

driver = webdriver.Chrome("./chromedriver")
driver.get("https://www.example.co.jp/dp/zzzzzzzzzz/")


select_box = driver.find_element_by_name("dropdown_selected_size_name")
options = [x for x in select_box.find_elements_by_tag_name("option")]
for element in options:
    values.append(element.get_attribute("value"))
    classes.append(element.get_attribute("class"))
    data-a-html-contents.append(element.get_attribute("data-a-html-content"))

df = pd.DataFrame(data=list(zip(values, classes, data-a-html-contents)), columns=['Value', 'Class', 'Data-a-Html-Content'])

output = pd.DataFrame(my_list)
output.to_csv("Data.csv", encoding='utf-8-sig')

参考文献

您可以在以下位置找到一些相关的详细讨论:

Selenium: Web-Scraping Historical Data from Coincodex and transform into a Pandas Dataframe Python Selenium: How do I print the values from a website in a text file?

【讨论】:

感谢@DebanjanB 提供了非常丰富的回复和资源,感谢您的建议和澄清,我将继续学习,输出将每个数据列表写入此图像中所见的行link 我试过了添加在您发布的数据框链接中看到的列(3 列标题),但收到以下错误ValueError: 3 columns passed, passed data had 1 columns 可能是由于逗号分隔符未被识别吗?感谢您帮助我学习这个项目! @crawf 我已经解决了我的代码中的一个小错误。如果当前的代码适合你,你能更新我吗?

以上是关于Pandas DF.output 写入列(当前数据全部写入一行或一列)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas .to_sql 将 JSON 列写入 Postgres

Python Pandas - 如何在 Excel 工作表的特定列中写入

使用 Python/Pandas 将多索引数据写入 excel 文件

pandas_udf结果无法写入表

Python:将列表写入 Pandas 中的列

如何在同一列中写入两个不同变量值的excel/pandas Dataframe