[英]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.