[英]Python Pandas compare two dataframes then edit
首先抱歉,如果这是重复的,我是初学者,所以我不太了解别人问题的全部含义。
我正在尝试为一个学校项目制作一个脚本,该脚本通过一个带有多个链接的大型 Excel 文件,并从网页上抓取价格,将其与 Excel 中实际价格列中的价格进行比较。 如果发现没有区别:很好,但如果确实如此。 它应该用它刚刚刮掉的新价格来编辑价格。
例如
Excel file :
| Link | Price |
| -------- | -------------- |
| Product1 | 119 |
| Product2 | 89 |
Scraped data :
| Price |
| -------------- |
| 119 |
| 91 |
If this scenario happens, the Excel file should be edited to become like this :
| Link | Price |
| -------- | -------------- |
| Product1 | 119 |
| Product2 | 91 |
现在我只能将价格刮成一个清单并将 Excel 文件转换为 Dataframe,但我真的不知道下一步该做什么......
这是我的代码
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
b =[]
tableau = pd.read_excel (r'PriceTrackerTrails\liens.xlsx')
links = pd.DataFrame(tableau, columns=['prix','liens'])
for i in links.index:
html = requests.get(links['liens'][i]).text
soup = bs(html, 'lxml')
a = soup.find('span', {"itemprop":"price"}).text
b.append(a)
print(links['prix'])
print(b)
output:
0 139,00
1 98
Name: prix, dtype: object
['139,00', '112,00']
先感谢您 !
在 for 循环中,使用a
中的值更新links['prix']
中的值,如下所示:
for i in links.index:
html = requests.get(links['liens'][i]).text
soup = bs(html, 'lxml')
a = soup.find('span', {"itemprop":"price"}).text
b.append(a)
links.loc[i, 'prix'] = a
要访问哪些行有价格更新,我会以不同的方式执行此操作,并在链接 dataframe 中创建一个新列,该列存储新价格而不是覆盖“prix”列中的值,并创建列表, b
. 这样,验证数据会更容易,并且不需要单独的列表b
。 为此,您只需将loc
方法更改为新的列名:
for i in links.index:
html = requests.get(links['liens'][i]).text
soup = bs(html, 'lxml')
a = soup.find('span', {"itemprop":"price"}).text
b.append(a)
links.loc[i, 'prix_new'] = a
然后创建一个新的 dataframe ,其中仅包含价格发生变化的行,如下所示:
price_updated = links[links['prix']!=links['prix_new']].reset_index()
reset_index
使这个新 dataframe 的行索引从 0 开始(默认情况下会复制)。 如果您想保留行索引,使其与links
dataframe 匹配,则将reset_index
替换为copy
,这样您就不会收到SettingWithCopyWarning
警告,即有关更改 DataFrame 切片副本上的值的警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.